CoDeSys+&n   Example_BCD1.2 vom 14.10.2004Andreas Schiff, ICS GmbHxDas Programm steuert das AS-Interface Anzeigemodul AM004 an und gibt im Sekundentakt eine um 1 erhhte Zahl aus. nC   %(3KAKOK]Kr+yyQs/`SSerial (RS232)Lokal_3S Serial RS232 driver,PortCOM1COM8YBaudrate4800%9600K1920038400576001152004ParityNoEvenOdd3Stop bits11,527dMotorola byteorderNoYesyQs/`SSerial (RS232)Lokal_3S Serial RS232 driver,PortCOM1COM8YBaudrate4800%9600K1920038400576001152004ParityNoEvenOdd3Stop bits11,527dMotorola byteorderNoYesK>,8T,CoDeSys 1-2.2. "$ '(P~@@@@@@MNOP`atyzbcde_Q\RUXZ  "!#$^fghijkFHJLNPRUSTVlopqrsuuv."$ '(tyzbde\RUXZ  "!#$fghijkFHJLNPRUSTVopqrsuuv)g geettiStandard Parameter OD(%Typ des OD-Eintrags whlen. BOOL 8-bit-Integer16-bit-Integer32-bit-Integerbyteword double wordrealstringlong real (64-bit)lowmiddlehigh read only write only read-writeStandard Variable ODlowmiddlehigh read only write only read-writedl I1:ep  Module.Root-1 __not_found__Hardware configurationIBdect * E%QBOO NDAR%MB%Module.ASI_Master11 Module.Root AS-i Master 1IBdect * E%QBOO NDAR%MB% 30Module.ASI_StdSlave1Module.ASI_Master1 Single SlaveIBct * E%QB NDAR%MB%aDI0Input D0Channel.ASIBitInput1Module.ASI_StdSlaveIX * E%aDI1Input D1Channel.ASIBitInput2Module.ASI_StdSlaveIX * E%aDI2Input D2Channel.ASIBitInput3Module.ASI_StdSlaveIX * E%aDI3Input D3Channel.ASIBitInput4Module.ASI_StdSlaveIX * E%aDO0 Output D0Channel.ASIBitOutput5Module.ASI_StdSlaveQXNDAR%aDO1 Output D1Channel.ASIBitOutput6Module.ASI_StdSlaveQXNDAR%aDO2 Output D2Channel.ASIBitOutput7Module.ASI_StdSlaveQXNDAR%aDO3 Output D3Channel.ASIBitOutput8Module.ASI_StdSlaveQXNDAR%   31AModule.ASI_ABSlave1Module.ASI_Master1 A/B SlaveIBct * E%QB NDAR%MB%aDI0Input 0Channel.ASIBitInput1Module.ASI_ABSlaveIX * E%aDI1Input 1Channel.ASIBitInput2Module.ASI_ABSlaveIX * E%aDI2Input 2Channel.ASIBitInput3Module.ASI_ABSlaveIX * E%aDI3Input 3Channel.ASIBitInput4Module.ASI_ABSlaveIX * E%aDO0Output 0Channel.ASIBitOutput5Module.ASI_ABSlaveQXNDAR%aDO1Output 1Channel.ASIBitOutput6Module.ASI_ABSlaveQXNDAR%aDO2Output 2Channel.ASIBitOutput7Module.ASI_ABSlaveQXNDAR%   31BModule.ASI_ABSlave1Module.ASI_Master1 A/B SlaveIBct * E%QB NDAR%MB%aDI0Input 0Channel.ASIBitInput1Module.ASI_ABSlaveIX  * E%aDI1Input 1Channel.ASIBitInput2Module.ASI_ABSlaveIX  * E%aDI2Input 2Channel.ASIBitInput3Module.ASI_ABSlaveIX  * E%aDI3Input 3Channel.ASIBitInput4Module.ASI_ABSlaveIX  * E%aDO0Output 0Channel.ASIBitOutput5Module.ASI_ABSlaveQX NDAR%aDO1Output 1Channel.ASIBitOutput6Module.ASI_ABSlaveQX NDAR%aDO2Output 2Channel.ASIBitOutput7Module.ASI_ABSlaveQX NDAR%> XCxVAR_GLOBAL END_VAR X# =j"`>$ALonStandard> > ND BnA\VAR_CONFIG END_VAR ',BB\Globale_Variablen> B?esVaabs  VAR_GLOBAL ASI1_AUTO_ADDRESS, ASI1_AUTO_ADDRESS_POSSIBLE, ASI1_CONFIG_OK: BOOL; ASI1_NORMAL, ASI1_OFFLINE, ASI1_POWER_FAIL: BOOL; ASI1_PROJECTION_MODE, ASI1_SLAVE0_EXIST, ASI1_PERIPHERY_OK: BOOL; ASI1_AUTO_ADDRESS_ENABLE, ASI1_DATA_EXCHANGE_ACTIVE: BOOL; ASI2_AUTO_ADDRESS, ASI2_AUTO_ADDRESS_POSSIBLE, ASI2_CONFIG_OK: BOOL; ASI2_NORMAL, ASI2_OFFLINE, ASI2_POWER_FAIL: BOOL; ASI2_PROJECTION_MODE, ASI2_SLAVE0_EXIST, ASI2_PERIPHERY_OK: BOOL; ASI2_AUTO_ADDRESS_ENABLE, ASI2_DATA_EXCHANGE_ACTIVE: BOOL; END_VAR < it&gphGlobale'XX;Variablen_Konfiguration> >futi, t VAR_CONFIG END_VAR D_VAR VAR_OUTPUT Q1: BOOL; END_VAR%,BPLC_PRGnC nC PROGRAM PLC_PRG (* ------------------------------------------------------------------------------------------------------------------------------------------------------- *) (* Anzeige-Text-Beispielprogramm *) (* *) (* ICS GmbH, Hopfenstrae 1, 88069 Tettnang, Autor: Andreas Schiff Version 1.2 *) (* *) (* Dieses Beispielprogramm dient nur zur Demonstration der Funktion des AM004. Es kann keine Gewhr dafr *) (* bernommen werden, dass dieses Programm in einem realen Automatisierungsprojekt fehlerfrei luft. *) (* ------------------------------------------------------------------------------------------------------------------------------------------------------- *) VAR AnzeigeB: SerComBCD; (* Funktionsbaustein fr BCD-Wandlung und Ausgabe *) Taktgeber3: TON; Takt2: BOOL; HB2: BOOL; Taktgeber4: TON; Takt1: BOOL; Zaehler: INT; (* Zahl, die angezeigt wird *) Plus:BYTE:=0; (* Pluszeichen soll ausgegeben werden *) Text:ARRAY [0..7] OF BYTE:=16#26, 16#26, 16#26, 16#26, 16#6D, 16#62, 16#61, 16#72; (* Textformatierung fr unterlagerten Text: Die Zeichen &&&& werden von der Zahl berschrieben *) Diagnose: BYTE; DI2 AT %IX1.5.2: BOOL; (* Im Beispiel hat das Anzeigemodul die Adresse 5 *) DI3 AT %IX1.5.3: BOOL; DO0 AT %QX1.5.0: BOOL; DO1 AT %QX1.5.1: BOOL; END_VAR (* Ende des Deklarationsteils *)G (* --------------------------------------------------------------- Hauptprogramm ---------------------------------------------------------------- *) (* In diesem Programm wird alle 1s die Variable "Zhler" um 1 erhht. Die Variable wird anschlieend auf dem einzeiligen Textdisplay ausgegeben. Daraus kann die Zeit, die fr die Aktualisierung der Anzeige bentigt wird, abgeschtzt werden. *) (* Takt: 1000ms *) Taktgeber3(IN:=Takt2,PT:=t#100ms); HB2:=NOT Taktgeber3.Q; Taktgeber4(IN:=HB2,PT:=t#900ms); Takt2:=Taktgeber4.Q; AnzeigeB(DI2:=DI2, DI3:=DI3, Variable:=Zaehler, Format:=Plus,Text:=Text); Diagnose:=AnzeigeB.Diagnosis; DO0:=AnzeigeB.DO0; DO1:=AnzeigeB.DO1; IF Takt1<>Takt2 AND Takt2=TRUE THEN Zaehler:=Zaehler+1; IF (Zaehler>999 OR Zaehler<-999) THEN Zaehler:=-999; END_IF; END_IF; Takt1:=Takt2; ,( SerComBCDBnA BnA@FUNCTION_BLOCK SerComBCD (* ------------------------------------------------------------------------------------------------------------------------------------------------------- *) (* Dieser Funktionsbaustein wickelt die gesamte serielle Kommunikation zu einem AS-Interface Slave nach dem *) (* Profil S-B.A.5 ab. Gilt nur fr einzeilige Ausgabe mit der alternativen Mglichkeit der zyklischen Ausgabe im *) (* BCD-Code! Der Funktionsbaustein schreibt eine Zeile ASCII-Text im azyklischen Mode und dann die 4stellige *) (* Zahl, die im BCD-Code bergeben werden muss. *) (* *) (* ICS GmbH, Hopfenstrae 1, 88069 Tettnang, Autor: Andreas Schiff Version 0.4 Datum: 08.10.2004 *) (* verbesserter Abschluss eines gesendeten Telegramms *) (* ------------------------------------------------------------------------------------------------------------------------------------------------------- *) VAR_INPUT Variable: INT; (* auszugebene Zahl nach Magabe der Formatierung *) Format: BYTE; (* Formatierung der Variablen *) (* =0: Ganze Zahl im Bereich von -999 bis 9999 *) (* =1: wie vor, Pluszeichen wird zustzlich ausgegeben: -999 bis +999 *) (* =2: ausgegebene Zahl hat eine Nachkommastelle: -9,9 bis 99,9 *) (* =3: wie vor, Pluszeichen wird zustzlich ausgegeben: -9,9 bis +9,9 *) (* =6: wie 2, Zahl hat eine Nachkommastelle und Punkt statt Komma *) (* =7: wie 3, Zahl hat eine Nachkommastelle und Punkt statt Komma *) Text: ARRAY [0..7] OF BYTE:=16#7E,16#20,16#26,16#20,16#20,16#20,16#20,16#7F; DI2: BOOL; (* Eingang serielles Protokoll *) DI3: BOOL; (* Eingang serielles Protokoll *) END_VAR VAR_OUTPUT Diagnosis: BYTE; (* Diagnose-Daten: Bit 7: Slave nicht im seriellen Modus Bit 6: ID nicht korrekt (Soll: Vendor-ID: 1, Product-ID: 5) Bit 5: --- Bit 4 Slave busy Bit 0..3: Diagnoseinfo vom Slave *) DO0: BOOL; (* Ausgang serielles Protokoll *) DO1: BOOL; (* Ausgang serielles Protokoll *) END_VAR VAR DatIn: ARRAY [0..7] OF BYTE; (* Zyklischen Daten im BCD-Code *) ID_Data: ARRAY [0..15] OF BYTE; (* ID-Daten des Slaves *) InputD: ARRAY [0..20] OF BYTE; InputData: ARRAY [0..20] OF BYTE; (* Eingabe-Datenfeld *) OutputData: ARRAY [0..20] OF BYTE; (* Ausgabe-Datenfeld *) OutputLen: BYTE; (* Lnge der Ausgabedaten in Byte; Zahlenbereich 1..15 *) InputL: BYTE; (* Lnge der Eingabedaten in Byte; Zahlenbereich 1..15 *) InputLen: BYTE; Taktalt: BOOL; In: BYTE; (* aktuell empfangene Nachricht *) Inalt: BYTE; (* letzte empfangene Nachricht *) Out: BYTE:= 3; Watchdog: BOOL; Timeout: BYTE; Lastin: BYTE; (* letztes gltiges empfangenes Informationsbit *) i: BYTE; IBitzeiger: BYTE; Outalt: BYTE; Outzeiger: BYTE; OBitzeiger: BYTE; x: BYTE; Send: BOOL; y: BYTE; NewData: BOOL; SCSlave: BOOL; SSW: WORD; Inst1:TON; Inst2:TON; Takt:BOOL; Var2: BOOL; Acyclic: WORD; Para_DatIn: ARRAY [0..20] OF BYTE; DatInalt: ARRAY[0..20] OF BYTE; Timeout2: BYTE; MerkDat1: BOOL; MerkDat2: BOOL; Schluss: BOOL; ARS0Request: BOOL; ARSResponse_0: BOOL; ARS1Request: BOOL; ARSResponse_1: BOOL; ARS2Request: BOOL; ARSResponse_2: BOOL; AWS2Request: BOOL; AWSResponse_2: BOOL; Hunderter: INT; Einser: INT; Punkt: BOOL; Tausender: INT; Zehner: INT; Komma: BYTE; Steuerbyte:BYTE; Varalt: INT; END_VAR (* ----------------------------------------------Ende des Deklarationsteils------------------------------------------------------- *)s,(* Hier wird ein Takt mit einer Zykluszeit von 20ms generiert *) Inst1(IN:=Takt, PT:=t#10ms); Var2:=NOT Inst1.Q; Inst2(IN:=Var2, PT:=t#10ms); Takt:=Inst2.Q; (* ----------------------------- Hier wird die auszugebende Zahl in das richtige Format gebracht ------------------- *) (* Steuerbyte analysieren *) Steuerbyte:=Format; IF (Steuerbyte AND 16#2)<>0 THEN Punkt:=TRUE; IF (Steuerbyte AND 16#4)<>0 THEN Komma:=16#0E; Steuerbyte:=Steuerbyte AND 16#03; ELSE Komma:=16#0C; END_IF; ELSE Punkt:=FALSE; END_IF; IF Variable<>Varalt THEN IF (Variable<10000 AND Variable>=0 AND Steuerbyte=0) OR (Variable<1000 AND Variable>=0 AND (Steuerbyte=1 OR Steuerbyte=2)) OR (Variable<100 AND Variable>=0 AND Steuerbyte=3) THEN (* Ermitteln der max. 4 BCD-Stellen *) Tausender:=0; Hunderter:=Variable/100; Zehner:=0; Einser:=Variable-Hunderter*100; DatIn[0]:=0; DatIn[1]:=0; IF Hunderter>9 THEN Tausender:=Hunderter/10; Hunderter:=Hunderter-Tausender*10; END_IF; IF Einser>9 THEN Zehner:=Einser/10; Einser:=Einser-Zehner*10; END_IF; (* Eintragen der BCD-Stellen *) IF Punkt=TRUE THEN DatIn[0]:=SHL(INT_TO_BYTE(Hunderter),4)+INT_TO_BYTE(Zehner); DatIn[1]:=SHL(Komma,4)+INT_TO_BYTE(Einser); ELSE DatIn[0]:=SHL(INT_TO_BYTE(Tausender),4)+INT_TO_BYTE(Hunderter); DatIn[1]:=SHL(INT_TO_BYTE(Zehner),4)+INT_TO_BYTE(Einser); END_IF; (* Fhrende Nullen unterdrcken, ggf. Pluszeichen eintragen *) IF DatIn[0]<10 AND DatIn[0]>0 THEN DatIn[0]:=DatIn[0]+160; IF (Steuerbyte AND 16#1)=1 THEN DatIn[0]:=DatIn[0]+16; END_IF; END_IF; IF DatIn[0]=0 AND DatIn[1]>9 THEN IF Punkt=FALSE THEN DatIn[0]:=170; IF (Steuerbyte AND 16#1)=1 THEN DatIn[0]:=DatIn[0]+1; END_IF; ELSE DatIn[0]:=160; IF (Steuerbyte AND 16#1)=1 THEN DatIn[0]:=DatIn[0]+16; END_IF; END_IF; END_IF; IF DatIn[0]=0 AND DatIn[1]<10 THEN DatIn[0]:=170; DatIn[1]:=DatIn[1]+160; IF (Steuerbyte AND 16#1)=1 THEN DatIn[1]:=DatIn[1]+16; END_IF; END_IF; ELSIF (Variable>-1000 AND Variable<0 AND (Steuerbyte=0 OR Steuerbyte=1)) OR (Variable>-100 AND Variable<0 AND (Steuerbyte=2 OR Steuerbyte=3)) THEN Hunderter:=-Variable/100; Zehner:=0; Einser:=-Variable-Hunderter*100; IF Einser>9 THEN Zehner:=Einser/10; Einser:=Einser-Zehner*10; END_IF; (* Eintragen der BCD-Stellen *) IF Punkt=TRUE THEN DatIn[0]:=SHL(INT_TO_BYTE(Hunderter),4)+INT_TO_BYTE(Zehner); DatIn[1]:=SHL(Komma,4)+INT_TO_BYTE(Einser); ELSE DatIn[0]:=INT_TO_BYTE(Hunderter); DatIn[1]:=SHL(INT_TO_BYTE(Zehner),4)+INT_TO_BYTE(Einser); END_IF; (* Minuszeichen einbauen; fhrende Nullen unterdrcken *) IF Punkt=FALSE THEN IF DatIn[0]<10 AND DatIn[0]>0 THEN DatIn[0]:=DatIn[0]+208; END_IF; IF DatIn[0]=0 AND DatIn[1]>9 THEN DatIn[0]:=173; END_IF; IF DatIn[0]=0 AND DatIn[1]<10 THEN DatIn[0]:=170; DatIn[1]:=DatIn[1]+208; END_IF; ELSE DatIn[0]:=DatIn[0]+208; END_IF; ELSE DatIn[0]:=255; DatIn[1]:=255; END_IF; END_IF; (* ---------------------------------------------------- Hier wird das serielle Protokoll bedient -------------------------------- *) (* Eingnge des Slaves lesen, ausmaskieren und auf Vernderung prfen *) (* Hier wird umcodiert: In=3: Idle; In=1: Separator; In=0: DATA0; In=2: DATA1 *) IF DI2=FALSE AND DI3=FALSE THEN In:=0; END_IF; IF DI2=FALSE AND DI3=TRUE THEN In:=2; END_IF; IF DI2=TRUE AND DI3=FALSE THEN In:=1; END_IF; IF DI2=TRUE AND DI3=TRUE THEN In:=3; END_IF; IF In<>Inalt THEN (* eine Antwort ist eingetroffen *) IF Out=1 AND In=1 THEN (* die eine der erwarteten Antworten ist eingetroffen: Separator *) Watchdog:=FALSE; SCSlave:=TRUE; Timeout:=0; Lastin:=Inalt; (* Aktion 2: Trenn-Nachricht empfangen; Master sendet Information oder Idle *) IF Send=TRUE THEN IF Outalt=3 THEN (* Ausgabe initialisieren *) Outzeiger:=0; OBitzeiger:=0; y:=OutputData[0]; END_IF; IF Schluss=FALSE THEN Outalt:=Out; x:=y AND 2#1000_0000; IF x<>0 THEN Out:=2; ELSE Out:=0; END_IF; y:=SHL (y,1); OBitzeiger:=OBitzeiger+1; (* ein Byte fertig? Zeiger auf nchstes Byte stellen *) IF OBitzeiger>7 THEN Outzeiger:=Outzeiger+1; y:=OutputData[Outzeiger]; OBitzeiger:=0; IF Outzeiger>=OutputLen OR Outzeiger>=19 THEN Schluss:=TRUE; SCSlave:=TRUE; END_IF; END_IF; ELSE Outalt:=Out; Out:=3; (* zum Abschluss einer Nachricht wird mindestens 1 Idle gesendet! *) Send:=FALSE; Schluss:=FALSE; END_IF; ELSE Outalt:=Out; Out:=3; END_IF; IF Out=0 THEN DO0:=TRUE; DO1:=TRUE; END_IF; IF Out=1 THEN DO0:=FALSE; DO1:=TRUE; END_IF; IF Out=2 THEN DO0:=TRUE; DO1:=FALSE; END_IF; IF Out=3 THEN DO0:=FALSE; DO1:=FALSE; END_IF; ELSIF Out<>1 AND In<>1 THEN (* die andere der erwarteten Antworten ist eingetroffen: Idle oder Daten *) Watchdog:=FALSE; SCSlave:=TRUE; Timeout:=0; IF (In=0 AND Inalt<>2) OR (In=2 AND Inalt<>0) THEN (* Aktion 0/1: Slave hat Informationsbit gesendet: abspeichern; Master sendet Trenn-Nachricht *) IF Lastin=3 THEN (* Beginn einer Nachricht: Zeiger und Feld Initialisieren, wenn Feld bereit *) NewData:=FALSE; InputL:=0; IBitzeiger:=0; FOR i:=0 TO 19 DO InputD[i]:=0; END_FOR; END_IF; InputD[InputL]:=SHL(InputD[InputL],1); IF In=2 THEN InputD[InputL]:=InputD[InputL]+1; END_IF; IBitzeiger:=IBitzeiger+1; IF IBitzeiger>7 THEN InputL:=InputL+1; IF InputL>19 THEN InputL:=19; END_IF; IBitzeiger:=0; END_IF; Outalt:=Out; Out:=1; IF Out=0 THEN DO0:=TRUE; DO1:=TRUE; END_IF; IF Out=1 THEN DO0:=FALSE; DO1:=TRUE; END_IF; IF Out=2 THEN DO0:=TRUE; DO1:=FALSE; END_IF; IF Out=3 THEN DO0:=FALSE; DO1:=FALSE; END_IF; ELSE (* Aktion 3: Slave hat Idle gesendet: Abschluss einer Nachricht?; Master sendet Trenn-Nachricht *) IF Lastin<>3 THEN (* Abschluss einer Nachricht; wenn diese nicht vollstndig (also ganzzahlige Anzahl von Bytes), dann wird sie verworfen! *) IF IBitzeiger =0 THEN FOR i:=0 TO InputL DO InputData[i]:=InputD[i]; END_FOR; NewData:=TRUE; InputLen:=InputL; SCSlave:=TRUE; END_IF; END_IF; Outalt:=Out; Out:=1; IF Out=0 THEN DO0:=TRUE; DO1:=TRUE; END_IF; IF Out=1 THEN DO0:=FALSE; DO1:=TRUE; END_IF; IF Out=2 THEN DO0:=TRUE; DO1:=FALSE; END_IF; IF Out=3 THEN DO0:=FALSE; DO1:=FALSE; END_IF; END_IF; END_IF; ELSIF (Takt<>Taktalt AND Takt=TRUE) THEN (* Slave alle 120ms testen, ob er den seriellen Kommunikationsmodus untersttzt, dient auch zum Anlauf der Kommunikation *) Timeout:=Timeout+1; IF Timeout>4 THEN Outalt:=Out; IF (Out=0 OR Out=3) THEN Out:=1; ELSIF (Out=1 OR Out=2) THEN Out:=3; END_IF; Timeout:=0; SCSlave:=FALSE; SSW:=0; Send:=FALSE; IF Out=0 THEN DO0:=TRUE; DO1:=TRUE; END_IF; IF Out=1 THEN DO0:=FALSE; DO1:=TRUE; END_IF; IF Out=2 THEN DO0:=TRUE; DO1:=FALSE; END_IF; IF Out=3 THEN DO0:=FALSE; DO1:=FALSE; END_IF; END_IF; END_IF; (* Hier luft die Timeoutberwachung fr azyklische Dienste ab: 1s *) IF Taktalt<>Takt AND Takt=FALSE AND Acyclic<>0 THEN Timeout2:=Timeout2+1; IF Timeout2>151 THEN Acyclic:=0; Timeout2:=0; MerkDat1:=FALSE; MerkDat2:=FALSE; Diagnosis:=Diagnosis AND 16#EF; END_IF; END_IF; IF SCSlave=FALSE THEN Diagnosis:=Diagnosis OR 16#80; ARS0Request:=FALSE; ARSResponse_0:=FALSE; ARS1Request:=FALSE; ARSResponse_1:=FALSE; AWS2Request:=FALSE; ID_Data[1]:=0; ELSE Diagnosis:=Diagnosis AND 16#7F; END_IF; (* Kommandoaufrufe: ID des Slaves schon bekannt? *) IF ID_Data[1]=0 AND Acyclic=0 AND Send=FALSE AND SCSlave=TRUE THEN (* ID des Slaves abfragen *) OutputData[0]:=16; OutputData[1]:=0; OutputData[2]:=6; OutputLen:=3; Send:=TRUE; ARS0Request:=TRUE; Acyclic:=100; Diagnosis:=Diagnosis OR 16#10; END_IF; (* Kommandoaufrufe: Diagnose vom Slave zyklisch abrufen *) IF ARSResponse_0=TRUE AND ARSResponse_1=FALSE AND Acyclic=0 AND Send=FALSE AND SCSlave=TRUE THEN (* Diagnose des Slaves abfragen *) OutputData[0]:=16; OutputData[1]:=1; OutputData[2]:=1; OutputLen:=3; Send:=TRUE; ARS1Request:=TRUE; Acyclic:=101; Diagnosis:=Diagnosis OR 16#10; END_IF; (* Kommandoaufrufe: Parameter des Slaves schon bekannt? *) IF AWS2Request=FALSE AND Acyclic=0 AND Send=FALSE AND SCSlave=TRUE THEN (* Parameter an Slave senden *) OutputData[0]:=17; OutputData[1]:=2; OutputData[2]:=8; FOR i:=0 TO 7 DO OutputData[i+3]:=Text[i]; END_FOR; OutputLen:=11; Send:=TRUE; AWS2Request:=TRUE; ARSResponse_2:=FALSE; Acyclic:=103; Diagnosis:=Diagnosis OR 16#10; END_IF; (* Kommandoaufrufe: Parameter des Slaves schon bekannt? *) IF ARSResponse_2=FALSE AND Acyclic=0 AND Send=FALSE AND SCSlave=TRUE THEN (* Parameter des Slaves abfragen *) OutputData[0]:=16; OutputData[1]:=2; OutputData[2]:=8; OutputLen:=3; Send:=TRUE; ARS2Request:=TRUE; Acyclic:=102; Diagnosis:=Diagnosis OR 16#10; END_IF; (* Wenn einzeiliges Display, dann zyklische Ausgabe! *) IF Send=FALSE AND SCSlave=TRUE AND ID_Data[4]=208 AND (DatInalt[1]<>DatIn[1] OR DatInalt[0]<>DatIn[0]) THEN OutputData[0]:=1; OutputData[1]:=DatIn[0]; OutputData[2]:=DatIn[1]; DatInalt[0]:=DatIn[0]; DatInalt[1]:=DatIn[1]; OutputLen:=3; Send:=TRUE; END_IF; IF Newdata=TRUE THEN (* ID-Daten sind angekommen *) IF InputData[0]=80 AND Acyclic=100 THEN FOR i:=0 TO 5 DO ID_Data[i]:=InputData[i+1]; END_FOR; NewData:=FALSE; ARSResponse_0:=TRUE; Timeout2:=0; Acyclic:=0; IF ID_Data[1]<>1 OR ID_Data[3]<>5 THEN Diagnosis:=Diagnosis OR 16#40; ELSE Diagnosis:=Diagnosis AND 16#BF; END_IF; Diagnosis:=Diagnosis AND 16#EF; END_IF; (* Diagnosedaten sind angekommen *) IF InputData[0]=80 AND Acyclic=101 THEN InputData[1]:=InputData[1] AND 16#0F; Diagnosis:=Diagnosis AND 16#F0; Diagnosis:=Diagnosis OR InputData[1]; NewData:=FALSE; ARSResponse_1:=TRUE; Timeout2:=0; Acyclic:=0; Diagnosis:=Diagnosis AND 16#EF; END_IF; (* Parameter-Istdaten sind angekommen *) IF InputData[0]=80 AND Acyclic=102 THEN NewData:=FALSE; ARSResponse_2:=TRUE; Timeout2:=0; Acyclic:=0; FOR i:=0 TO 7 DO Para_DatIn[i]:=InputData[i+1]; END_FOR; Diagnosis:=Diagnosis AND 16#EF; END_IF; (* Acknowlede fr Parameter Schreiben ist angekommen *) IF InputData[0]=81 AND Acyclic=103 THEN NewData:=FALSE; AWSResponse_2:=TRUE; Timeout2:=0; Acyclic:=0; Diagnosis:=Diagnosis AND 16#EF; END_IF; (* Fehlerhafte Aufrufe*) IF InputData[0]=145 OR InputData[0]=144 THEN InputData[1]:=InputData[1] AND 16#0F; Diagnosis:=Diagnosis AND 16#F0; Diagnosis:=Diagnosis OR InputData[1]; NewData:=FALSE; Timeout2:=0; Acyclic:=0; Diagnosis:=Diagnosis AND 16#EF; END_IF; (* irgendein Fehler ist angekommen *) IF (InputData[0]=81 OR InputData[0]=0) AND Acyclic=0 THEN NewData:=FALSE; Diagnosis:=Diagnosis AND 16#EF; END_IF; END_IF; Taktalt:=Takt; Inalt:=In; Varalt:=Variable; ,Z;[..\..\..\..\Programme\CoDeSysForAutomationAlliance\Library\Util_no_Real.lib 6.3.01 12:00:42W..\..\..\..\Programme\CoDeSysForAutomationAlliance\Library\ecoasi20.lib 3.7.02 15:24:32[..\..\..\..\Programme\CoDeSysForAutomationAlliance\Library\ecoasi21ps.lib 10.10.03 14:10:08STANDARD.LIB 23.10.00 15:20:56IECSFC.LIB 23.10.00 15:20:30 BCD_TO_INTBLINK CHARCURVEEXTRACTGEN HYSTERESIS INT_TO_BCD LIMITALARMPACKPUTBITRAMP_INTSTATISTICS_INTUNPACKVersionGlobale_Variablenakt_IDCode_lesenakt_IOConf_lesenakt_Parameter_lesenakt_Parameter_refreshakt_Parameter_schreibenASiCmd20EAO_8IO Input7_1Light Input_lesen$Ist_Konfigurationsdaten_projektieren LAS_lesen LDS_lesen LPF_lesen LPS_lesenOutput_schreibenOutputP7_lightproj_IDCode_lesenproj_IOConf_lesenproj_Parameter_lesenproj_Parameter_schreibenPt100_4Channel SendReceiveESlave_adressierenGlobale_Variablen address_slaveASiCmd21 Exec_ASI_CmdGet_ASi_Config Get_ASi_InputGet_ASi_OutputGet_current_parameterGet_Global_ListsGet_LASGet_LDSGet_LPFGet_LPSGet_Master_flagsGet_projected_ASi_ConfigGet_projected_parameterGet_Slave_Error_CounterPeripheral_fault Project_allRefresh_current_parameterSet_ASi_OutputSet_current_parameterSet_ModeSet_projected_parameter SetTestMode Slave_activeSlave_detectedSlave_projectedGlobale_VariablenCONCATCTDCTUCTUDDELETEF_TRIGFINDINSERTLEFTLENMIDR_TRIGREPLACERIGHTRSRTCSEMASRTOFTONTPGlobal Variables 0SFCActionControlGlobale_Variablen,XXPLC_PRG.AnzeigeB.ARSResponse_2 PLC_PRG.AnzeigeB.In PLC_PRG.AnzeigeB.out PLC_PRG.AnzeigeB.NewData PLC_PRG.AnzeigeB.outx PLC_PRG.AnzeigeB.ARSResponse_0  BausteinePLC_PRG% SerComBCD  DatentypenVisualisierungenGlobale VariablenGlobale_VariablenVariablen_Konfiguration}