Hallo,
ich habe ein Problem mit dem IOW24. Ich möchte ein digitales IO mit jeweils 8 digitalen Ein- und Ausgängen realiseren. Die externe Beschaltung (Relais) ist bereits realisiert. Die notwendige Software wird später in Form einer dynamisch zu ladenden DLL in únsere Steuerungssoftware implementiert. Wie gesagt habe aber seit kurzem ein Problem. Und zwar:
Habe mir ein kleines Testprogramm geschrieben, dass mir die aktuellen Werte an den IOWPorts anzeigen (Port 0...Eingänge, Port1...Ausgänge).
Auf dem Starter-Kit befinden sich LED Leisten die mir die Zustände an den Ports anzeigen. Die Beschaltung des Eingangsports wird über einen DIL Schalter realisert. Mein testprogramm hat jeweils einen Button zum Lesen und Schreiben der Ports. Mein Problem ist nun, dass es notwendig ist den Zustand der Pins nach dem öffnen des IOW auszulesen. Nur leider klappt das bei mir nicht. Siehe Quellcode der Funktionen.
// TestUsbIoDlg.cpp : Implementierungsdatei
//
#include "stdafx.h"
#include "TestUsbIo.h"
#include "TestUsbIoDlg.h"
//#include "LCD.h"
#include "IoLcd.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
USBWIOSETUP usbwioset=
{
NULL, // IOWKIT_HANDLE devHandle; Handle auf den aktuellen Device-Driver(IOWKit)
NULL, // IOWKIT_HANDLE iows[IOWKIT_MAX_DEVICES] Handle auf alle IOWs im System
0, // ULONG numDevs; Anzahl der USB IOs im System
};
#pragma data_seg()
USBWINFO usbwinfo=
{
0, //UINT uiNumIOws - Anz. der IOWs im System
0x00, //char szType[14] - Typ Warrior 40 oder 24
0, //ULONG ulRevNr - Kit Revisionsnummer
NULL, //WCHAR wcSerNr[9] - Seriennummer
0, //ULONG ulProdId - Product ID
};
//Datenstruktur für USB Warrior Pins
USBWIODATA usbwiodata=
{
0x00,
0x00,
0x00,
};
//Eigene Funktionen
//***************************************************************************
// GetUSBWInfo(): Liefert das Basisverzeichnis von CNCWorkbench
//***************************************************************************
VOID GetUSBWInfo(IOWKIT_HANDLE devHandle)
{
usbwinfo.uiNumIOws = IowKitGetNumDevs();
IowKitGetSerialNumber (devHandle,usbwinfo.wcSerNr);
usbwinfo.ulProdId = IowKitGetProductId(devHandle);
//usbwinfo.ulRevNr = IowKitGetRevision(devHandle);
if (IowKitGetProductId(devHandle)==IOWKIT_PRODUCT_ID_IOW24)
{
strcpy(usbwinfo.szType,"IO Warrior 24");
}
else
{
strcpy(usbwinfo.szType,"IO Warrior 40");
}
}
/////////////////////////////////////////////////////////////////////////////
// CAboutDlg-Dialogfeld für Anwendungsbefehl "Info"
class CAboutDlg : public CDialog
{
public:
CAboutDlg();
// Dialogfelddaten
//{{AFX_DATA(CAboutDlg)
enum { IDD = IDD_ABOUTBOX };
//}}AFX_DATA
// Vom Klassenassistenten generierte Überladungen virtueller Funktionen
//{{AFX_VIRTUAL(CAboutDlg)
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV-Unterstützung
//}}AFX_VIRTUAL
// Implementierung
protected:
//{{AFX_MSG(CAboutDlg)
//}}AFX_MSG
DECLARE_MESSAGE_MAP()
};
CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD)
{
//{{AFX_DATA_INIT(CAboutDlg)
//}}AFX_DATA_INIT
}
void CAboutDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CAboutDlg)
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CAboutDlg, CDialog)
//{{AFX_MSG_MAP(CAboutDlg)
// Keine Nachrichten-Handler
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestUsbIoDlg Dialogfeld
CTestUsbIoDlg::CTestUsbIoDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestUsbIoDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestUsbIoDlg)
m_cstrLbProdID = _T("");
m_cstrLbSerNr = _T("");
m_cstrLbType = _T("");
m_dwOutVal = 0;
m_bPortIn = 0;
m_bPortOut = 0;
//}}AFX_DATA_INIT
// Beachten Sie, dass LoadIcon unter Win32 keinen nachfolgenden DestroyIcon-Aufruf benötigt
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTestUsbIoDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestUsbIoDlg)
DDX_Text(pDX, IDC_LB_PRODID, m_cstrLbProdID);
DDX_Text(pDX, IDC_LB_SERNR, m_cstrLbSerNr);
DDX_Text(pDX, IDC_LB_TYPE, m_cstrLbType);
DDX_Text(pDX, IDC_EDIT_OUTVAL, m_dwOutVal);
DDX_Text(pDX, IDC_EDIT_INPORT, m_bPortIn);
DDX_Text(pDX, IDC_EDIT_OUTPORT, m_bPortOut);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTestUsbIoDlg, CDialog)
//{{AFX_MSG_MAP(CTestUsbIoDlg)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
ON_BN_CLICKED(IDC_BTN_WRITE, OnBtnWrite)
ON_BN_CLICKED(IDC_BTN_READ, OnBtnRead)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestUsbIoDlg Nachrichten-Handler
BOOL CTestUsbIoDlg::OnInitDialog()
{
CDialog::OnInitDialog();
ULONG Res = 0x01;
// Hinzufügen des Menübefehls "Info..." zum Systemmenü.
// IDM_ABOUTBOX muss sich im Bereich der Systembefehle befinden.
ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX);
ASSERT(IDM_ABOUTBOX < 0xF000);
CMenu* pSysMenu = GetSystemMenu(FALSE);
if (pSysMenu != NULL)
{
CString strAboutMenu;
strAboutMenu.LoadString(IDS_ABOUTBOX);
if (!strAboutMenu.IsEmpty())
{
pSysMenu->AppendMenu(MF_SEPARATOR);
pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu);
}
}
// Symbol für dieses Dialogfeld festlegen. Wird automatisch erledigt
// wenn das Hauptfenster der Anwendung kein Dialogfeld ist
SetIcon(m_hIcon, TRUE); // Großes Symbol verwenden
SetIcon(m_hIcon, FALSE); // Kleines Symbol verwenden
//IO Warrior Öffnen und Infos ausgeben
usbwioset.devHandle=IowKitOpenDevice();
if(usbwioset.devHandle == NULL)
{
return FALSE;
}
GetUSBWInfo(usbwioset.devHandle);
//Label aktualisieren
UpdateData(true);
m_cstrLbType.Format( "Typ: %s",usbwinfo.szType);
m_cstrLbProdID.Format("Product ID: %ld",usbwinfo.ulProdId);
m_cstrLbSerNr.Format( "Serien-Nr: %S",usbwinfo.wcSerNr);
UpdateData(false);
return TRUE; // Geben Sie TRUE zurück, außer ein Steuerelement soll den Fokus erhalten
}
void CTestUsbIoDlg::OnSysCommand(UINT nID, LPARAM lParam)
{
if ((nID & 0xFFF0) == IDM_ABOUTBOX)
{
CAboutDlg dlgAbout;
dlgAbout.DoModal();
}
else
{
CDialog::OnSysCommand(nID, lParam);
}
}
// Wollen Sie Ihrem Dialogfeld eine Schaltfläche "Minimieren" hinzufügen, benötigen Sie
// den nachstehenden Code, um das Symbol zu zeichnen. Für MFC-Anwendungen, die das
// Dokument/Ansicht-Modell verwenden, wird dies automatisch für Sie erledigt.
void CTestUsbIoDlg::OnPaint()
{
if (IsIconic())
{
CPaintDC dc(this); // Gerätekontext für Zeichnen
SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
// Symbol in Client-Rechteck zentrieren
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2;
// Symbol zeichnen
dc.DrawIcon(x, y, m_hIcon);
}
else
{
CDialog::OnPaint();
}
}
// Die Systemaufrufe fragen den Cursorform ab, die angezeigt werden soll, während der Benutzer
// das zum Symbol verkleinerte Fenster mit der Maus zieht.
HCURSOR CTestUsbIoDlg::OnQueryDragIcon()
{
return (HCURSOR) m_hIcon;
}
void CTestUsbIoDlg::OnCancel()
{
IowKitCloseDevice(usbwioset.devHandle);
CDialog::OnCancel();
}
void CTestUsbIoDlg::OnBtnWrite()
{
/*IOW 24 I/O Modul:=======================
========================================*/
UpdateData(true);
IOWKIT24_IO_REPORT rep;
// Init report
rep.ReportID = 0;
rep.Value = 0xFFFF;
rep.Bytes[0] = 0xFF;
rep.Bytes[1] = (UCHAR)~m_dwOutVal; //Wert aus Eingabefeld
if (IowKitWrite(usbwioset.devHandle, IOW_PIPE_IO_PINS,
(PCHAR) &rep, IOWKIT24_IO_REPORT_SIZE) == IOWKIT24_IO_REPORT_SIZE)
{
}
else
{
AfxMessageBox("Schreiben nicht erfolgreich",MB_OK,0);
}
}
/***************************************************************************
IowReadImmediate(PDWORD buffer)
Lesen eines Bytes ueber die allgemeine Funktion
****************************************************************************/
BOOLEAN IowReadImmediate(PDWORD buffer)
{
BOOLEAN rc;
rc = IowKitReadImmediate(usbwioset.devHandle, buffer);
return rc;
}
void CTestUsbIoDlg::OnBtnRead()
{
/*IOW 24 I/O Modul:=======================
========================================*/
DWORD read=0x00;
BOOLEAN rc = FALSE;
BYTE port0=0x00; //Eingangsport
BYTE port1=0x00; //Ausgangsport
for (int i=0;i<9;i++)
{
rc = IowKitReadImmediate(usbwioset.devHandle,(ULONG*)&read);
}
printf("%.8x \n",read);
//Ausmaskieren des Wertes des Eingangsport
port0= read & 0xFF;
read >>= 8;
printf("%.8x \n",read);
//Ausmaskieren des Wertes des Ausgangsport
port1= read & 0xFF;
read >>= 8;
printf("%.8x \n",read);
//Member Variablen der Eingabefelder
m_bPortIn = ~port0; //Komplement da LED Status anders
m_bPortOut = ~port1; //Komplement da LED Status anders
UpdateData(false);
}
void CTestUsbIoDlg::OnOK()
{
IowKitCloseDevice(usbwioset.devHandle);
CDialog::OnOK();
}
Leider wird über die Funktion IowKitReadImmediate nach dem Klick auf den Button Lesen (OnBtnRead) nicht der aktuelle Status an den Pins gelesen obwohl die ersten beiden DIL Schalter (P0.0 und P0.1) betätigt sind. An den Prozessor Pins P0.0 und P0.1 kann ich aber messen das sie nicht beschaltet sind.
Die Funktion IowKitReadImmediate liefert mir einen ULONG* zurück in dem aber wie gesagt nur 0xFFFFFFFF steht! Der Zustand der Pins ist erst richtig gelesen, wenn ich einen Schreibzugriff gemacht habe. Ich denke das liegt daran, dass sich der Status der Pins geändert hat.
Mein Ziel ist nach dem Öffnen des IOW sofort den aktuellen Zustand (Wert) des Eingangsports zu haben (P0) da dies für meine Aufgabe unbedingt nötig ist. Ich finde den Fehler nicht! Vielleicht habe ich auch nur irgend etwas überlesen oder mache irgend etwas falsch!!!
Danke schon mal im vorraus!
Digitale IOS
Moderator: Guido Körber
Auch dieses Forum hat eine Suchfunktion (hilft natürlich nur weiter, wenn man weiß, wonach man sucht ;-)
http://www.codemercs.de/phpBB2/viewtopi ... t&start=25
http://www.codemercs.de/phpBB2/viewtopi ... t&start=25