CoDeSys+"n   Example CTT31.0 vom 12.10.2005A. Schiff, ICS GmbHDas Programm wickelt die Kommunikation mit einem Slave nach dem Profil S-7.A.A entsprechend der AS-Interface Spezifika- tion Version 3.0 ab. Es gibt ein Byte Infor- mation an den Slave aus und liest ein Byte Information vom Slave ein.# D  %(KKKK+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>= ,0t$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% 1AModule.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% 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%> ):CxVAR_GLOBAL END_VAR X# =j"`>$ALonStandard> > ND ):C\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,nn+CTT3z D Y D4FUNCTION_BLOCK CTT3 (* ********************************************************************************************************************* *) (* fr Firmware 2.0 Datum: 28.02.2006 *) (* ********************************************************************************************************************* *) VAR_INPUT DI0:BOOL; DI1:BOOL; DI2:BOOL; DI3:BOOL; OutByte:BYTE; (* Byte mit Ausgabeinformation fr den Slave *) END_VAR VAR_OUTPUT DO0:BOOL; DO1:BOOL; DO2:BOOL; InByte:BYTE; (* Byte mit Eingabeinformation vom Slave *) OK:BOOL; (* =TRUE: Datenverkehr in Ordnung, Eingabebyte gltig =FALSE: Datenverkehr gestrt, Eingabebyte nicht gltig *) END_VAR VAR OutB: BYTE; InB:BYTE; Y: BYTE; Z1: BYTE; Z2: BYTE; Z3:BYTE; Z4:BYTE; END_VAR2 IF DI3=FALSE AND DI2=FALSE THEN (* Beginn der Sequenz, Ausgabebyte wird eingefroren, DO6 und DO7 werden bertragen *) OutB:=OutByte; InB:=InB AND 2#00111111; IF DI1=TRUE THEN InB:=InB OR 2#10000000; END_IF; IF DI0=TRUE THEN InB:=InB OR 2#01000000; END_IF; Y:=OutB AND 2#10000000; IF Y<>0 THEN DO1:=TRUE; ELSE DO1:=FALSE; END_IF; Y:=OutB AND 2#01000000; IF Y<>0 THEN DO0:=TRUE; ELSE DO0:=FALSE; END_IF; Z1:=Z1+1; Z2:=0; IF Z1>100 AND Z1<200 THEN OK:=FALSE; DO2:=NOT DI2; DO1:=FALSE; DO0:=FALSE; InByte:=0; ELSIF Z1>199 THEN Z1:=100; OK:=FALSE; DO2:=DI2; DO1:=FALSE; DO0:=FALSE; InByte:=0; ELSE DO2:=DI2; END_IF; END_IF; IF DI3=FALSE AND DI2=TRUE THEN (* Zweiter Schritt der Sequenz, DO4 und DO5 werden bertragen *) InB:=InB AND 2#11001111; IF DI1=TRUE THEN InB:=InB OR 2#00100000; END_IF; IF DI0=TRUE THEN InB:=InB OR 2#00010000; END_IF; Y:=OutB AND 2#00100000; IF Y<>0 THEN DO1:=TRUE; ELSE DO1:=FALSE; END_IF; Y:=OutB AND 2#00010000; IF Y<>0 THEN DO0:=TRUE; ELSE DO0:=FALSE; END_IF; Z2:=Z2+1; Z3:=0; IF Z2>200 THEN Z2:=200; OK:=FALSE; IF DI2=DO2 THEN DO2:= NOT DI2; ELSE DO2:=DI2; END_IF; DO1:=FALSE; DO0:=FALSE; InByte:=0; ELSE DO2:=DI2; END_IF; END_IF; IF DI3=TRUE AND DI2=FALSE THEN (* Dritter Schritt der Sequenz, DO2 und DO3 werden bertragen *) InB:=InB AND 2#11110011; IF DI1=TRUE THEN InB:=InB OR 2#00001000; END_IF; IF DI0=TRUE THEN InB:=InB OR 2#00000100; END_IF; Y:=OutB AND 2#00001000; IF Y<>0 THEN DO1:=TRUE; ELSE DO1:=FALSE; END_IF; Y:=OutB AND 2#00000100; IF Y<>0 THEN DO0:=TRUE; ELSE DO0:=FALSE; END_IF; Z3:=Z3+1; Z4:=0; IF Z3>200 THEN Z3:=200; OK:=FALSE; IF DI2=DO2 THEN DO2:= NOT DI2; ELSE DO2:=DI2; END_IF; DO1:=FALSE; DO0:=FALSE; InByte:=0; ELSE DO2:=DI2; END_IF; END_IF; IF DI3=TRUE AND DI2=TRUE THEN (* Vierter Schritt der Sequenz, DO0 und DO1 werden bertragen *) InB:=InB AND 2#11111100; IF DI1=TRUE THEN InB:=InB OR 2#00000010; END_IF; IF DI0=TRUE THEN InB:=InB OR 2#00000001; END_IF; Y:=OutB AND 2#00000010; IF Y<>0 THEN DO1:=TRUE; ELSE DO1:=FALSE; END_IF; Y:=OutB AND 2#00000001; IF Y<>0 THEN DO0:=TRUE; ELSE DO0:=FALSE; END_IF; Z4:=Z4+1; Z1:=0; IF Z4>200 THEN Z4:=200; OK:=FALSE; IF DI2=DO2 THEN DO2:= NOT DI2; ELSE DO2:=DI2; END_IF; DO1:=FALSE; DO0:=FALSE; InByte:=0; ELSE DO2:=DI2; END_IF; IF Z1<10 AND Z2<10 AND Z3<10 AND Z4<10 THEN OK:=TRUE; InByte:=InB; ELSE InByte:=0; END_IF; END_IF; %, PLC_PRG`VC `VC PROGRAM PLC_PRG (*---------------------------------------------------------------------------------------------------------------------------------------------------------*) (* Testprogramm fr CTT3-Datenbertragung mit Slave-Profil S-7.A.A (8E/8A-Modul) *) (* Slave muss mit der Adresse 1a im Netzwerk vorhanden sein. Der Master ist Client und reagiert auf *) (* Slave-Telegramme entsprechend der Combined Transaction Type 3 aus Spezifikation Version 3.0 *) (* Die Variable OKAY bezieht sich ausschlielich auf die CTT3-Kommunikation und bezieht den Peri- *) (* pheriefehler nicht mit ein! *) (* Dieses Beispielprogramm dient nur zur Demonstration der Funktion des PB020. Es kann keine Gewhr dafr *) (* bernommen werden, dass dieses Programm in einem realen Automatisierungsprojekt fehlerfrei luft. *) (*Programmversion 2.0 Autor: Andreas Schiff Datum: 28.02.2006 *) (*---------------------------------------------------------------------------------------------------------------------------------------------------------*) VAR DO0 AT %QX1.1.0:BOOL; (* Ausgang DO0 *) DO1 AT %QX1.1.1:BOOL; (* Ausgang DO1 *) DO2 AT %QX1.1.2:BOOL; (* Ausgang DO2 *) DI0 AT %IX1.1.0:BOOL; (* Eingang DI0 *) DI1 AT %IX1.1.1:BOOL; (* Eingang DI1 *) DI2 AT %IX1.1.2:BOOL; (* Eingang DI2 *) DI3 AT %IX1.1.3:BOOL; (* Eingang DI3 *) Input:BYTE; (* 8 Bit Eingangsdaten vom Slave (nur gltig, wenn OKAY=TRUE!) *) Output:BYTE; (* 8 Bit Ausgangsdaten zum Slave *) Okay:BOOL; (* =TRUE, wenn Daten korrekt bertragen worden sind =FALSE, wenn Fehler in bertragung festgestellt wurde *) CTT3:CTT3; (* Funktionsbaustein fr Kommunikation mit PS020 *) Taktgeber3:TON; Taktgeber4:TON; HB2:BOOL; Takt2:BOOL; Takt2alt: BOOL; END_VAR (* Ende des Deklarationsteils *)(* Hauptprogramm *) CTT3(DI0:=DI0, DI1:=DI1, DI2:=DI2, DI3:=DI3, OutByte:=Output); DO0:=CTT3.DO0; DO1:=CTT3.DO1; DO2:=CTT3.DO2; Input:=CTT3.InByte; Okay:=CTT3.OK; ,Z;W..\..\..\..\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:30akt_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,XXb  BausteineCTT3PLC_PRG% DatentypenVisualisierungenGlobale VariablenGlobale_VariablenVariablen_Konfiguration+$