Welcome to our new forum
All users of the legacy CODESYS Forums, please create a new account at account.codesys.com. But make sure to use the same E-Mail address as in the old Forum. Then your posts will be matched.
Close
ich versuche mit CoDeSys die serielle Schnittstelle eines IPCs anzusprechen. Funktionieren tut das leider nicht wirklich. Genauer gesagt kann ich noch nicht mal sagen, was nicht funktioniert, also ob nicht gesendet oder nicht empfangen wird (ist auch am Gerät nicht sichtbar ob irgendwas passiert). Ich spreche ein Steuerungsmodul für verschiedenere Temperaturmessgehänge an. Testweise hab ich auch mal ein .Net Programm geschrieben, bei diesem bekomme ich auch eine Antwort. Vielleicht hat irgendwer von euch Tipps, was ggf. falsch sein kann?
Parameter im .Net Programm waren mit der Baudrate 9600, 8 Datenbits, 1 Stopbit, kein Paritätsbit eingestellt.
Als Befehl wird der String "57 65 6E 6E 65 47 0001 00 00 00 05 00 00 00 00" (ja, in der Mitte die 0001 ist so richtig) gefolgt von einem LF (Char Zeichen 10) abgesetzt.
Zum Senden hab ich folgenden Code geschrieben:
PROGRAM PLC_PRG
VAR
ComSettings : COMSETTINGS;
_ : _;
bInit : BOOL := TRUE;
bWrite : BOOL := TRUE;
End_init: BOOL;
port : PORTS:=COM1;
nWrite : DWORD;
WriteBuffer : STRING;
END_VAR
IF bInit THEN
ghCOM:=SysComOpen(Port:=port);
ComSettings.dwBaudRate := 9600;
ComSettings.byStopBits := 1;
ComSettings.byParity := 0;
ComSettings.Port := port;
( Einstellung für Data Bits? )
( SysComSetSettings(hCOM, ADR(ComSettings)); )
(* Testweise mit _ *)_.dwBaudRate:=9600;_.byStopBits:=1;_.byParity:=0;_.Port:=port;_.cByteSize:=8;_.fOutxCtsFlow:=FALSE;_.fDtrControl:=0;_.fDsrSensitivity:=FALSE;_.fRtsControl:=0;_.fOutxDsrFlow:=FALSE;_(ghCOM,ADR(_));bInit:=FALSE;
END_IF
IF bWrite AND ghCOM > 0 THEN
WriteBuffer:= CONCAT('57 65 6E 6E 65 47 0001 00 00 00 05 00 00 00 00', '$L'); ( $L=Zeilenvorschub $N=Neue Zeile $R=Zeilenumbruch )
nWrite := SysComWrite(dwHandle:=ghCOM, dwBufferAddress:=ADR(WriteBuffer),
dwBytesToWrite:=LEN(WriteBuffer), dwTimeOut:=0);
( nWrite ist danach größer 0 )
bWrite:=FALSE;
END_IF
Zum Lesen habe ich mittlerweile ein eigenes Programm erstellt:
IF ghCOM > 0 THEN
nRead := SysComRead(dwHandle:=ghCOM, dwBufferAddress:=ADR(ReadBuffer), dwBytesToRead:=100, dwTimeout:=1000);
IF nRead > 0 THEN
gsRead := ReadBuffer;
END_IF
END_IF
ghCOM = global Double
gsRead = global String
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Vielen Dank für die Info. Hab das jetzt mal entsprechend geändert. Also, der Handle ist positiv, Wert z.B. 7780.
Aber bPortState bleibt auf False und wird durch SysComSetSettings nicht geändert, auch nicht, wenn das danach im Zyklus irgendwann aufgerufen wird.
Muss ich vielleicht irgendwas in der Konfiguration ändern?
Also ich habe hier einen kleinen Embedded PC, in dem zwei CAN Anschlüsse per PCI Karte eingebaut wurden. Zusätzlich sind noch zwei normale COM Anschlüsse vorhanden. Die Steuerung selbst läuft in der RTE.
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Genau so läufts bei uns auf der RTE auch. Sowohl unter Windows als auch unter Linux.
Bis von SysComSetSettings eine Rückgabe kommt, kanns aber auch mehrere Zyklen dauern.
Gruß Erik
If you would like to refer to this comment somewhere else in this project, copy and paste the following link:
Guten Morgen,
ich versuche mit CoDeSys die serielle Schnittstelle eines IPCs anzusprechen. Funktionieren tut das leider nicht wirklich. Genauer gesagt kann ich noch nicht mal sagen, was nicht funktioniert, also ob nicht gesendet oder nicht empfangen wird (ist auch am Gerät nicht sichtbar ob irgendwas passiert). Ich spreche ein Steuerungsmodul für verschiedenere Temperaturmessgehänge an. Testweise hab ich auch mal ein .Net Programm geschrieben, bei diesem bekomme ich auch eine Antwort. Vielleicht hat irgendwer von euch Tipps, was ggf. falsch sein kann?
Parameter im .Net Programm waren mit der Baudrate 9600, 8 Datenbits, 1 Stopbit, kein Paritätsbit eingestellt.
Als Befehl wird der String "57 65 6E 6E 65 47 0001 00 00 00 05 00 00 00 00" (ja, in der Mitte die 0001 ist so richtig) gefolgt von einem LF (Char Zeichen 10) abgesetzt.
Zum Senden hab ich folgenden Code geschrieben:
PROGRAM PLC_PRG
VAR
ComSettings : COMSETTINGS;
_ : _;
bInit : BOOL := TRUE;
bWrite : BOOL := TRUE;
End_init: BOOL;
port : PORTS:=COM1;
nWrite : DWORD;
WriteBuffer : STRING;
END_VAR
IF bInit THEN
ghCOM:=SysComOpen(Port:=port);
ComSettings.dwBaudRate := 9600;
ComSettings.byStopBits := 1;
ComSettings.byParity := 0;
ComSettings.Port := port;
( Einstellung für Data Bits? )
( SysComSetSettings(hCOM, ADR(ComSettings)); )
END_IF
IF bWrite AND ghCOM > 0 THEN
WriteBuffer:= CONCAT('57 65 6E 6E 65 47 0001 00 00 00 05 00 00 00 00', '$L'); ( $L=Zeilenvorschub $N=Neue Zeile $R=Zeilenumbruch )
nWrite := SysComWrite(dwHandle:=ghCOM, dwBufferAddress:=ADR(WriteBuffer),
dwBytesToWrite:=LEN(WriteBuffer), dwTimeOut:=0);
( nWrite ist danach größer 0 )
bWrite:=FALSE;
END_IF
Zum Lesen habe ich mittlerweile ein eigenes Programm erstellt:
IF ghCOM > 0 THEN
nRead := SysComRead(dwHandle:=ghCOM, dwBufferAddress:=ADR(ReadBuffer), dwBytesToRead:=100, dwTimeout:=1000);
IF nRead > 0 THEN
gsRead := ReadBuffer;
END_IF
END_IF
ghCOM = global Double
gsRead = global String
Hab gesehen, dass der Code etwas verändert wurde.
ComSettings : COMSETTINGS;
: ;
= ComSettings Ex : COMSETTINGS EX
(ghCOM, ADR()); =
SysComSetSettings Ex(ghCOM, ADR(ComSettings Ex));
Moin
Bei mir sieht das so aus:
p_Comsettings.Port := iPort;
p_Comsettings.dwBaudRate := dwBaudrate;
(p_Comsettings.cByteSize := cByteSize; )
p_Comsettings.byParity := byParity;
p_Comsettings.byStopBits := byStopBits;
p_Comsettings.dwScan := 0;
dwPortHandle := SysComOpen(p_Comsettings.Port);
IF dwPortHandle <> 16#FFFFFFFF THEN
bPortState := SysComSetSettings(dwPortHandle, ADR(p_Comsettings));
Erst Port erfolgreich öffnen (das kann mehr als einen Zyklus dauern), dann PortSettings
Gruß Erik
Vielen Dank für die Info. Hab das jetzt mal entsprechend geändert. Also, der Handle ist positiv, Wert z.B. 7780.
Aber bPortState bleibt auf False und wird durch SysComSetSettings nicht geändert, auch nicht, wenn das danach im Zyklus irgendwann aufgerufen wird.
Muss ich vielleicht irgendwas in der Konfiguration ändern?
Also ich habe hier einen kleinen Embedded PC, in dem zwei CAN Anschlüsse per PCI Karte eingebaut wurden. Zusätzlich sind noch zwei normale COM Anschlüsse vorhanden. Die Steuerung selbst läuft in der RTE.
Moin
Genau so läufts bei uns auf der RTE auch. Sowohl unter Windows als auch unter Linux.
Bis von SysComSetSettings eine Rückgabe kommt, kanns aber auch mehrere Zyklen dauern.
Gruß Erik
Mhh. Mal schauen, wir haben jetzt nen Termin mit den Herstellern. Vielleicht können die uns nen Tipp geben.