-> Hier kostenlos registrieren
Ich muss ein Beckhoff CP66 an eine IDS-SPS Acos 750 mittels der Schnittstelle IEC 60870-5-104 anbinden. Die Kommunikation steht, allerdings ist das Senden von Daten mittels Bckhoff CPs noch fehlerhaft. Auf Seiten der IDS-SPS müsste alles korrekt eingerichtet sein, da ich mit der ganzen Sache bei IDS vorort war und das mit einem IDS-Servicetechniker durchgegangen bin.
Kann jemand erkennen wo der fehler liegt? Nachfolgend liste ich die Nötigen Infos zur Kommunikation:
Ich habe ein Szenario durchgespielt bei dem ich einen Befehl von dem Beckhoffpanel an die Ids-SPS schickte und anschliesend eine Meldung von der Ids-SPS an das Beckhoff Panel. Das Senden der Meldung funktionierte, das Senden des Befehls allerdings nicht korrekt. Den ganzen Verkehr auf der Schnittstelle habe ich mit einem Programm von Ids(IEC Tester) siehe unten. Durchgeführt habe ich das ganze mit dem SPS-Beispielprogramm MiniMasterSample(von Beckhoff Website, Programm siehe unten). Am Ende des Test-Szenarios habe ich von dem IEC-Tester aus nochmals einen Befehl auf die Ids-SPS gesendet, welcher dort erfolgeich empfangen wurde.
Das Programm der Beckhoff SPS CP66:
Log der Schnittstelle (interpretiert):
Log des Systemmanagers von Beckhoff:
Screenshot der Fehlermeldung des Funktionsbausteins F_iecAddTableEntry (Diese besagt laut Fehlertabelle, dass das Applikationsobjekt nicht in der Datenbank sei)
Ich weis das is nicht das einfachste Rätsel, aber vielleicht weis ja ein Crack rat? Ich verzweifle nämlich bald
Kann jemand erkennen wo der fehler liegt? Nachfolgend liste ich die Nötigen Infos zur Kommunikation:
Ich habe ein Szenario durchgespielt bei dem ich einen Befehl von dem Beckhoffpanel an die Ids-SPS schickte und anschliesend eine Meldung von der Ids-SPS an das Beckhoff Panel. Das Senden der Meldung funktionierte, das Senden des Befehls allerdings nicht korrekt. Den ganzen Verkehr auf der Schnittstelle habe ich mit einem Programm von Ids(IEC Tester) siehe unten. Durchgeführt habe ich das ganze mit dem SPS-Beispielprogramm MiniMasterSample(von Beckhoff Website, Programm siehe unten). Am Ende des Test-Szenarios habe ich von dem IEC-Tester aus nochmals einen Befehl auf die Ids-SPS gesendet, welcher dort erfolgeich empfangen wurde.
Aktuelle Einstellungen des Projekts:
Einstellungen die auf beiden Geräten gleich sind:
max. unquitierte ADPUs bei Übertragung (k) : 12
max. empfangene ADPUs bei Übertragung (w) : 8
Verbindungstimeout (t0): 30s
Quittierungstimeout (t1): 15s
Quittierungstimeout (t2): 10s
Verbindungstest Timeout (t3): 20s
Übertragungsursache (Cause of Transfer size): 2 octets
Geräteadressengröße (Common ASDU address size): 2 octets
Informationsobjektadressengröße (Information object adress size): 3 octets
Geräteadresse (Common ASDU adress): 40
max. unquitierte ADPUs bei Übertragung (k) : 12
max. empfangene ADPUs bei Übertragung (w) : 8
Verbindungstimeout (t0): 30s
Quittierungstimeout (t1): 15s
Quittierungstimeout (t2): 10s
Verbindungstest Timeout (t3): 20s
Übertragungsursache (Cause of Transfer size): 2 octets
Geräteadressengröße (Common ASDU address size): 2 octets
Informationsobjektadressengröße (Information object adress size): 3 octets
Geräteadresse (Common ASDU adress): 40
auf Beckhoffseite ist des weiteren folgendes eingestellt (wofür ich auf IDS Seite keine Einstellmöglichkeit fand):
Originator address: 1
Max. APDU length: 253 (muss dieser Wert bei beiden gleich sein? ich konnte keine Einstellmöglichkeit finden)
Local port address: 2404
Local host adress: 192.168.253.97 (dies ist die eigene IP des Slave Bedienteils)
Originator address: 1
Max. APDU length: 253 (muss dieser Wert bei beiden gleich sein? ich konnte keine Einstellmöglichkeit finden)
Local port address: 2404
Local host adress: 192.168.253.97 (dies ist die eigene IP des Slave Bedienteils)
auf IDS-Seite ist des weiteren folgendes eingestellt:
Max. APDU length: 112 (muss dieser Wert bei beiden gleich sein? ich konnte keine Einstellmöglichkeit finden)
IP des Master(Zieladresse): 192.168.253.97
Eigene IP-Adresse: 192.168.253.99
Max. APDU length: 112 (muss dieser Wert bei beiden gleich sein? ich konnte keine Einstellmöglichkeit finden)
IP des Master(Zieladresse): 192.168.253.97
Eigene IP-Adresse: 192.168.253.99
Das Programm der Beckhoff SPS CP66:
Code:
PROGRAM MAIN
VAR
AODB : ARRAY[0..1] OF ST_IEC870_5_101AODBEntry;
hTable : T_HAODBTable;
client : FB_IEC870_5_104Master;
init : BOOL := TRUE;
asduAddr : DWORD := 40; (* Common ASDU address of remote (slave) station *)
SPI AT%MX0.0 : BOOL;(* Single point information (data point used in monitoring direction slave->master) *)
SCS AT%MX1.5 : BOOL;(* Single command state (data point used in control direction master->slave) *)
fbCloseAll : FB_SocketCloseAll;
END_VAR
fbCloseAll( bExecute := init );
IF fbCloseAll.bBusy AND NOT init THEN
RETURN;
END_IF
IF init THEN
init := FALSE;
(* Configure protocol parameter *)
client.protPara.sRemoteHost := '192.168.253.99'; (* IP address of remote (slave) station *)
client.protPara.nRemotePort := 2404; (* Port number (default) of remote (slave) station *)
(* Configure system parameter *)
client.sysPara.dbgMode := IEC870_DEBUGMODE_DEVSTATE; (* Enable debug output of device state change *)
client.sysPara.asduAddr := asduAddr; (* common ASDU address of remote (slave) station *)
F_iecCreateTableHnd( ADR( AODB ), SIZEOF( AODB ), hTable );(* Initialize database handle *)
(* Configure one single point in monitoring direction *)
F_iecAddTableEntry( M_SP_NA_1, (* type is single point *)
asduAddr, (* common ASDU address *)
4400, (* information object address *)
IEC870_GRP_INROGEN, (* interrogation group *)
0,(* multiplier (not used) *)
MAP_AREA_MEMORY,(* map this single point value TO PLC memory area (buffer) *)
0, (* map TO byte offset *)
0, (* map TO bit offset *)
0, (* not used *)
hTable );(* database handle *)
(* Configure one single command in control direction *)
F_iecAddTableEntry( C_SC_NA_1, (* type is single command *)
asduAddr, (* common ASDU address *)
25577,(* information object address *)
0, (* group (not used) *)
0, (* multiplier (not used) *)
MAP_AREA_MEMORY, (* map this single command value FROM PLC memory area (buffer) *)
1, (* map FROM byte offset *)
5, (* map FROM bit offset *)
0, (* not used *)
hTable );(* database handle *)
ELSE
client( pAOEntries := ADR( AODB ),
cbAOEntries := SIZEOF( AODB ),
pInputs := 0, (* not used *)
cbInputs := 0, (* not used *)
pOutputs := 0, (* not used *)
cbOutputs := 0, (* not used *)
pMemory := ADR( %MB0 ),
cbMemory := 2,(* 2 byte size *)
pData := 0, (* not used *)
cbData := 0, (* not used *)
bEnable := TRUE,
hTable := hTable );
(* Check for device errors, remove them and log message to the TwinCAT System Manager log view *)
REPEAT
client.system.device.errors.RemoveError( );
IF client.system.device.errors.bOk THEN
ADSLOGSTR( ADSLOG_MSGTYPE_ERROR OR ADSLOG_MSGTYPE_LOG,
'IEC60870-5-104 master error: 0x%s',
DWORD_TO_HEXSTR( client.system.device.errors.getError.nErrId, 8, FALSE) );
END_IF
UNTIL NOT client.system.device.errors.bOk
END_REPEAT
END_IF
Log der Schnittstelle (interpretiert):

Log des Systemmanagers von Beckhoff:

Screenshot der Fehlermeldung des Funktionsbausteins F_iecAddTableEntry (Diese besagt laut Fehlertabelle, dass das Applikationsobjekt nicht in der Datenbank sei)

Ich weis das is nicht das einfachste Rätsel, aber vielleicht weis ja ein Crack rat? Ich verzweifle nämlich bald
