PROGRAM PRG_SDO1003
VAR_INPUT
Start: BOOL;
END_VAR
VAR
fbAdsReadSDO: ADSREAD;
fbSDO1003Read: R_TRIG;
bSDO1003Read: BOOL;
Error:DWORD;
SDO1003Read_Data: ARRAY [1..256] OF BYTE;
SDO1003Read_SubIndex: DWORD := 16#0001;
fbAdsWriteSDO: ADSWRITE;
bSDO1003Write: BOOL;
SDO1003Write_Data: ARRAY [1..4] OF BYTE := 16#00;
AntriebSteht: BOOL;
fbLocalSystemTime: FB_LocalSystemTime;
Fehler: WORD;
Antrieb: BYTE;
FehlerAlt: WORD;
AntriebAlt: BYTE;
DatenSchreiben: BOOL;
i: INT;
END_VAR
VAR CONSTANT
SDO1003Read_Index: DWORD := 16#1003;
SDO1003Read_DataLength: DWORD := 16#0004;
SDO1003Write_Index: DWORD := 16#1003;
SDO1003Write_SubIndex: DWORD := 16#0000;
SDO1003Write_DataLength: DWORD := 16#0004;
END_VAR
(*********************************************)
(* SDO 1003 Read Single *)
(*********************************************)
(* Check Rising Edge *)
fbSDO1003Read(CLK:= Start);
IF fbSDO1003Read.Q THEN
bSDO1003Read := TRUE;
MEMSET( ADR(SDO1003Read_Data), 16#00, SIZEOF(SDO1003Read_Data) );
Error := 0;
SDO1003Read_SubIndex := 16#0001;
END_IF
FOR i := 1 TO 8 DO
IF bSDO1003Read THEN
fbAdsReadSDO( NETID:= sADSNetIdCanOpenMaster,
PORT:= ADSPort,
IDXGRP:= SDO1003Read_Index,
IDXOFFS:= SDO1003Read_SubIndex,
LEN:= SDO1003Read_DataLength,
DESTADDR:= ADR(SDO1003Read_Data),
READ:= TRUE,
TMOUT:= t#5s);
IF fbAdsReadSDO.ERR THEN
Error := fbAdsReadSDO.ERRID;
bSDO1003Read := FALSE;
Start := FALSE;
ELSE
IF NOT fbAdsReadSDO.BUSY THEN
bSDO1003Read := FALSE;
Start := FALSE;
END_IF
END_IF
ELSE
fbAdsReadSDO( NETID:= sADSNetIdCanOpenMaster,
PORT:= ADSPort,
IDXGRP:= SDO1003Read_Index,
IDXOFFS:= SDO1003Read_SubIndex,
LEN:= SDO1003Read_DataLength,
DESTADDR:= ADR(SDO1003Read_Data),
READ:= FALSE,
TMOUT:= t#5s);
END_IF
IF SDO1003Read_Data[3] <> 0 THEN
CASE SDO1003Read_Data[1] OF
16#00:
CASE SDO1003Read_Data[2] OF
16#20:
Fehler := 16#2000;
16#30:
Fehler := 16#3000;
16#40:
Fehler := 16#4000;
16#73:
Fehler := 16#7300;
END_CASE
16#12:
IF SDO1003Read_Data[2] = 16#86 THEN
Fehler := 16#8612;
END_IF
16#21:
IF SDO1003Read_Data[2] = 16#71 THEN
Fehler := 16#7121;
END_IF
16#30:
IF SDO1003Read_Data[2] = 16#55 THEN
Fehler := 16#5530;
END_IF
16#31:
IF SDO1003Read_Data[2] = 16#55 THEN
Fehler := 16#5531;
END_IF
16#41:
IF SDO1003Read_Data[2] = 16#55 THEN
Fehler := 16#5541;
END_IF
16#80:
IF SDO1003Read_Data[2] = 16#50 THEN
Fehler := 16#5080;
END_IF
16#81:
IF SDO1003Read_Data[2] = 16#50 THEN
Fehler := 16#5081;
END_IF
16#82:
IF SDO1003Read_Data[2] = 16#50 THEN
Fehler := 16#5082;
END_IF
END_CASE
Antrieb := SDO1003Read_Data[3];
ELSE
Fehler := 0;
END_IF
IF Antrieb = 25 THEN
HRA08Steht := TRUE;
END_IF
CASE Fehler OF
16#2000, 16#3000, 16#4000, 16#7121, 16#8612, 16#7300, 16#5530, 16#5080, 16#5081, 16#5082, 16#5531, 16#5541:
AntriebSteht := TRUE;
ELSE
AntriebSteht := FALSE;
END_CASE
IF AntriebSteht AND Antrieb = 25 THEN
(* SDOs löschen *)
bSDO1003Write := TRUE;
(* Datum und Uhrzeit auslesen *)
fbLocalSystemTime(bEnable:= TRUE, dwCycle:= 1);
IF fbLocalSystemTime.bValid THEN
LogDaten := SYSTEMTIME_TO_STRING(fbLocalSystemTime.systemTime);
LogDaten := CONCAT(LogDaten, '; Zyklus: ');
LogDaten := CONCAT(LogDaten, UDINT_TO_STRING(zaehler));
LogDaten := CONCAT(LogDaten, '; Antrieb: ');
LogDaten := CONCAT(LogDaten, BYTE_TO_STRING(Antrieb));
LogDaten := CONCAT(LogDaten, '; Fehler: ');
LogDaten := CONCAT(LogDaten, WORD_TO_STRING(Fehler));
LogDaten := CONCAT(LogDaten, '; Index: ');
LogDaten := CONCAT(LogDaten, BYTE_TO_STRING(SDO1003Read_Data[4]));
LogDaten := CONCAT(LogDaten, '$n');
DatenSchreiben := TRUE;
bWriteData := TRUE;
END_IF
AntriebSteht := FALSE;
CASE zvLogger OF
0: (* *)
IF DatenSchreiben THEN
zvLogger := 10;
DatenSchreiben := FALSE;
END_IF
10: (* Datei öffnen *)
fbLogFileOpen( sNetId:= '',
sPathName:= LogFileName,
nMode:= FOPEN_MODEWRITE OR FOPEN_MODETEXT,
ePath:= PATH_GENERIC,
bExecute:= TRUE,
tTimeout:= t#2s,
bBusy=> ,
bError=> ,
nErrId=> ,
hFile=> hFile);
IF NOT fbLogFileOpen.bBusy THEN
fbLogFileOpen(bExecute := FALSE);
zvLogger := 20;
END_IF
20: (* Datei schreiben *)
IF NOT PRG_HRunLog.fbFtrigBtnRunLog.Q THEN
IF bWriteData THEN
fbLogFileWrite( sNetId:= '',
hFile:= hFile,
pWriteBuff:= ADR(LogDaten),
cbWriteLen:= LEN(LogDaten),
bExecute:= TRUE,
tTimeout:= t#3s,
bBusy=> ,
bError=> ,
nErrId=> ,
cbWrite=> );
IF NOT fbLogFileWrite.bBusy THEN
fbLogFileWrite(bExecute := FALSE);
bWriteData := FALSE;
END_IF
END_IF
ELSE
zvLogger := 30;
END_IF
30: (* Datei schließen *)
fbLogFileClose( sNetId:= '',
hFile:= hFile,
bExecute:= TRUE,
tTimeout:= t#3s,
bBusy=> ,
bError=> ,
nErrId=> );
IF NOT fbLogFileClose.bBusy THEN
fbLogFileClose(bExecute := FALSE);
zvLogger := 0;
END_IF
END_CASE
END_IF
SDO1003Read_SubIndex := SDO1003Read_SubIndex + 1;
IF SDO1003Read_SubIndex < 8 THEN
bSDO1003Read := TRUE;
END_IF
END_FOR
IF bSDO1003Write THEN
fbAdsWriteSDO( NETID:= sADSNetIdCanOpenMaster,
PORT:= ADSPort,
IDXGRP:= SDO1003Write_Index,
IDXOFFS:= SDO1003Write_SubIndex,
LEN:= SDO1003Write_DataLength,
SRCADDR:= ADR(SDO1003Write_Data),
WRITE:= TRUE,
TMOUT:= t#5s);
IF fbAdsWriteSDO.ERR THEN
Error := fbAdsWriteSDO.ERRID;
bSDO1003Write := FALSE;
ELSE
IF NOT fbAdsWriteSDO.BUSY THEN
bSDO1003Write := FALSE;
HRA08Steht := FALSE;
END_IF
END_IF
ELSE
fbAdsWriteSDO( NETID:= sADSNetIdCanOpenMaster,
PORT:= ADSPort,
IDXGRP:= SDO1003Write_Index,
IDXOFFS:= SDO1003Write_SubIndex,
LEN:= SDO1003Write_DataLength,
SRCADDR:= ADR(SDO1003Write_Data),
WRITE:= FALSE,
TMOUT:= t#5s);
END_IF