1、COMLIB 通讯程序示例1. COMLIB 通讯程序示例1. 1 PC ( COM1 和 COM2 ) 按字节发送 - 接收全局变量VAR_GLOBAL (* Test COM1 at PC Interface COM1 *) COM1InData AT %IB100 : PcComInData; COM1OutData AT %QB100 : PcComOutData; COM1RxBuffer : ComBuffer; COM1TxBuffer : ComBuffer; (* Test COM2 at PC Interface COM2 *) COM2InData AT %IB200 :
2、 PcComInData; COM2OutData AT %QB200 : PcComOutData; COM2RxBuffer : ComBuffer; COM2TxBuffer : ComBuffer;END_VAR后台程序:ComBackgroundPROGRAM ComBackgroundVAR COM1Control : PcComControl; COM2Control : PcComControl;END_VARCOM1Control( COMin := COM1InData , COMout := COM1OutData , TxBuffer := COM1TxBuffer ,
3、 RxBuffer := COM1RxBuffer );COM2Control( COMin := COM2InData , COMout := COM2OutData , TxBuffer := COM2TxBuffer , RxBuffer := COM2RxBuffer );测试程序:TESTCOM1PROGRAM TESTCOM1VAR SendData : ARRAY0.9 OF BYTE := 1,2,3,4,5,6,7,8,9,10; RecData : ARRAY0.9 OF BYTE; COM1Send : SendByte; COM2Rec : ReceiveByte; D
4、elay : TON; I : BYTE; Index : BYTE := 0;END_VAR(* 按字节方式发送数据到 COM1 *)Delay(IN := TRUE,PT := T#100MS);IF Delay.Q THEN Delay(IN := FALSE); FOR i := 0 TO 9 DO COM1Send( SendByte := SendDatai, TxBuffer := COM1TxBuffer); END_FOR FOR i := 0 TO 9 DO SendDatai := SendDatai + 1; END_FOREND_IF(* 按字节方式从 COM2 接收
5、数据 *)COM2Rec( RxBuffer := COM2RXbuffer);IF COM2Rec.ByteReceived THEN RecDataIndex := COM2Rec.ReceivedByte; Index := Index + 1; IF Index = SIZEOF(RecData) THEN Index := 0; END_IFEND_IF主程序:MAINPROGRAM MAINVAREND_VARTESTCOM1;1.2 PC ( COM1 和 COM2 ) 按字符串发送-接收全局变量 : 同上后台程序:ComBackground 同上测试程序:TESTCOM1PRO
6、GRAM TESTCOM1VAR SendString : STRING := $Hello, welcome to BECKHOFF !$; RecString : STRING;(注:可变换为无 Prefix 和 Suffix 示例,应加:TIMEOUT := T#80MS ) Prefix : STRING := $; Suffix : STRING := $; TimeOut : TIME := T#0MS; Reset : BOOL; COM1SString : SendString; COM2RString : ReceiveString; Delay : TON;END_VAR(
7、* 按字符串方式发送数据到 COM1 *)Delay(IN := TRUE,PT := T#100MS);IF Delay.Q THEN Delay(IN := FALSE); COM1SString( SendString := SendString, TxBuffer := COM1TxBuffer);END_IF(* 按字符串方式从 COM2 接收数据 *)COM2RString( Prefix := Prefix, Suffix := Suffix, Timeout := TimeOut, Reset := Reset, ReceivedString := RecString, RxB
8、uffer := COM2RxBuffer);主程序:MAINPROGRAM MAINVAREND_VARTESTCOM1;1.3 PC ( COM1 和 COM2 ) 按数据发送-接收全局变量 : 同上后台程序:ComBackground 同上测试程序:TESTCOM1PROGRAM TESTCOM1VAR Prefix : ARRAY0.1 OF BYTE := 16#0D,16#0A; Suffix : ARRAY0.1 OF BYTE := 16#0D,16#0A; SendData : ARRAY0.9 OF BYTE := 16#0D,16#0A,1,2,3,4,5,6,16#0D
9、,16#0A; RecData : ARRAY0.9 OF BYTE; COM1SData : SendData; COM2RData : ReceiveData; Delay : TON; Reset : BOOL; i : BYTE;END_VAR(* 按任意类型数据方式发送数据到 COM1 *)Delay(IN := TRUE,PT := T#100MS);IF Delay.Q THEN Delay(IN := FALSE); COM1SData( pSendData := ADR(SendData), Length := SIZEOF(SendData), TxBuffer := CO
10、M1TxBuffer); FOR i := 2 TO 7 DO SendDatai := SendDatai + 1; END_FOREND_IF(* 按任意类型数据方式从 COM2 接收数据 *) COM2RData( pPrefix := ADR(Prefix), LenPrefix := SIZEOF(Prefix), pSuffix := ADR(Suffix), LenSuffix := SIZEOF(Suffix), pReceiveData := ADR(RecData), SizeReceiveData := SIZEOF(RecData), Timeout := T#50MS
11、, Reset := Reset, RxBuffer := COM2RxBuffer);主程序:MAINPROGRAM MAINVAREND_VARTESTCOM1;1.4 ASC 功能说明主程序:MAINPROGRAM MAINVAR ascout : BYTE; str : STRING := a;END_VARascout := ASC(str);1.5 CHR 功能说明主程序:MAINPROGRAM MAINVAR chrout : STRING; cinp : BYTE := 48;END_VARchrout := CHR(cinp);1.6 KL6001 串行数据通讯全局变量 :V
12、AR_GLOBAL Kl6InData AT %IB0 : KL6inData5B; Kl6OutData AT %QB0 : KL6outData5B; RxBuffer : ComBuffer; TxBuffer : ComBuffer;END_VAR主程序:PROGRAM MAINVAR ComControl : KL6Control5B; Timer : TON; Receive : ReceiveByte; Send : SendByte; Rb : BYTE; Sb : BYTE;END_VAR ComControl( COMin:=KL6InData , COMout:=KL6O
13、utData , TxBuffer:=TxBuffer , RxBuffer:=RxBuffer ); Timer(IN:=TRUE , PT:=T#1S ); IF Timer.Q THEN (* 每秒发送一个字符 *) IF Sb = 0 THEN Sb := 64; END_IF Sb := Sb + 1; IF Sb 90 THEN Sb := 64; END_IF Send(SendByte:=Sb , TxBuffer:=TxBuffer ); Timer(IN:=FALSE ); END_IF Receive( RxBuffer:=Rxbuffer ); IF Receive.B
14、yteReceived THEN (* 获取接收的字符 *) Rb := Receive.ReceivedByte; (* 其它程序处理 . *) END_IF1.6 KL6021 KL6021 RS-485 之间的串行数据通讯1.6.1 发送方:全局变量 :VAR_GLOBAL KL6021_1InData AT %IB0 : KL6inData5B; KL6021_1OutData AT %QB0 : KL6outData5B; KL6021_1RxBuffer : ComBuffer; KL6021_1TxBuffer : ComBuffer;END_VAR主程序:PROGRAM MAI
15、NVAR KL6021_1ComControl : KL6Control5B; KL6021_1Send : SendByte; SendData : ARRAY0.9 OF BYTE := 10(16#68); Index1 : BYTE := 0; T01 : TON; I : BYTE; KL6021_1Receive : ReceiveByte; ReceiveData : ARRAY0.19 OF BYTE := 20(16#0); Index : BYTE := 0;END_VARKL6021_1ComControl( COMin := KL6021_1InData, COMout
16、 := KL6021_1OutData, RxBuffer := KL6021_1RxBuffer, TxBuffer := KL6021_1TxBuffer);(* = KL6021_1 Send Data = *)IF NOT KL6021_1Send.Busy THEN KL6021_1Send( SendByte := SendDataIndex1, TxBuffer := KL6021_1TxBuffer); Index1 := Index1 + 1; IF Index1 = SIZEOF(SendData) THEN Index1 := 0; END_IFEND_IFT01( IN
17、 := NOT T01.Q,PT := T#800MS);SendData0 := 16#FF;SendData1 := 16#FF;SendData9 := 16#0D;IF T01.Q THEN FOR i := 2 TO 8 DO SendDatai := SendDatai + i; END_FOREND_IFKL6021_1Receive( RxBuffer := KL6021_1RXbuffer);IF KL6021_1Receive.ByteReceived THEN ReceiveDataIndex := KL6021_1Receive.ReceivedByte; Index
18、:= Index + 1; IF Index = SIZEOF(ReceiveData) THEN Index := 0; END_IFEND_IF%QB6 := SendData2;1.6.2 接收方:全局变量 :VAR_GLOBAL KL6021_2InData AT %IB0 : KL6inData5B; KL6021_2OutData AT %QB0 : KL6outData5B; KL6021_2RxBuffer : ComBuffer; KL6021_2TxBuffer : ComBuffer;END_VAR主程序:PROGRAM MAINVAR KL6021_2ComContro
19、l : KL6Control5B; KL6021_2Receive : ReceiveByte; ReceiveData : ARRAY0.19 OF BYTE := 20(16#0); Index : BYTE := 0;END_VARKL6021_2ComControl( COMin := KL6021_2InData, COMout := KL6021_2OutData, RxBuffer := KL6021_2RxBuffer, TxBuffer := KL6021_2TxBuffer);(* = KL6021_2 receive Data = *)KL6021_2Receive( R
20、xBuffer := KL6021_2RXbuffer);IF KL6021_2Receive.ByteReceived THEN ReceiveDataIndex := KL6021_2Receive.ReceivedByte; Index := Index + 1; IF Index = SIZEOF(ReceiveData) THEN Index := 0; END_IFEND_IF2. Modbus RTU 通讯2.1 PC 作 Modbus RTU 从站全局变量:VAR_CONFIG MAIN.MB.Port.IO.out AT %QB0 : ModbusPcComOutData;
21、MAIN.MB.Port.IO.in AT %IB0 : ModbusPcComInData;END_VAR主程序:PROGRAM MAINVAR MB1 : ModbusRtuSlave_PcCOM; Input AT %IW100 : ARRAY 0.9 OF WORD; Output AT %QW100 : ARRAY 0.9 OF WORD; Memory AT %MW100 : ARRAY 0.9 OF WORD; ErrorID : Modbus_Errors;END_VARTwinCAT 系统管理器链接:略2.2 PC 作 Modbus RTU 主站示例程序参见:Modbus R
22、TU 软件说明2.3 BC 作 Modbus RTU 主站示例程序参见:Modbus RTU 软件说明2.4 BC 作 Modbus RTU 从站示例程序参见:Modbus RTU 软件说明2.5 PC 作 Modbus RTU 主站,BC7300 作从站示例程序2.5.1 PC 机程序全局变量:VAR_CONFIG MAIN.MB.Port.IO.out AT %QB0 : ModbusPcComOutData; MAIN.MB.Port.IO.in AT %IB0 : ModbusPcComInData;END_VAR主程序:PROGRAM MAINVAR MB1 : ModbusRtuM
23、aster_PcCOM; ReadVal : ARRAY0.4 OF WORD; UnitID : BYTE := 11; Quantity : WORD := 2; MBAddr : WORD := 0; cbLength : UINT := 4; bExecute : BOOL; bBusy : BOOL; Error : BOOL; ErrorID : MODBUS_ERRORS; cbRead : UINT;END_VARTwinCAT 系统管理器链接:略2.5.2 BC7300 测试程序Blink 程序:PROGRAM BlinkVAR Timer1 : TON; Timer2 :
24、TON; fbCounter1 : CTU; fbCounter2 : CTD;END_VAR主程序:PROGRAM MAINVAR bInput AT %IX0.0 : BOOL;END_VARIF NOT bInput THENBlink;%QX0.1 := TRUE;ELSE%QX0.1 := FALSE;END_IF2.6 PC 与 BC8000 / BK8000 通讯程序:略2.7 ADS 通讯程序:略3. PID 控制示例:3.1 惯性环节测试:PROGRAM MAINVAR fbPT1 : FB_P_T1; bInit : BOOL := TRUE; fCycleTime : L
25、REAL := 0.01; Kp : LREAL := 1.0; T1 : LREAL := 5.0; fVal : LREAL := 80.0; fOut : LREAL;END_VAR3.2 BCxxxx PID 测试:3.2.1 过程对象仿真:FUNCTION_BLOCK SIMUVAR_INPUT Inp : REAL;END_VARVAR_IN_OUT Index : BYTE; Buffer : ARRAY0.9 OF REAL;END_VARVAR_OUTPUT Out : REAL;END_VARVAR i : BYTE; Sum : REAL;END_VARIF (Index
26、 9) OR (Index 0) THEN Index := 0;END_IFBufferIndex := Inp;Index := Index + 1;Sum := 0;FOR i := 0 TO 9 DO Sum := Sum + Bufferi;END_FOROut := Sum / 10.0;3.2.2 测试程序:TESTPROGRAM TESTVAR SIMU1 : SIMU; Vinp : REAL ; Index : BYTE := 0; Buffer : ARRAY 0.9 OF REAL; Vout : REAL; PID1 : CtrlStandardPID; bInit
27、: BOOL := TRUE; Vset : REAL := 50.0; fKp : REAL := 0.8; fTn : REAL := 0.28; nErrorStatus : DINT; bMax AT %QX0.0 : BOOL; bMin AT %QX0.1 : BOOL; bARW : BOOL; conv AT %QB1 : BYTE;END_VAR3.2.3 主程序:MAINPROGRAM MAINVAREND_VARTEST;3.3 温度控制示例3.3.1 过程对象仿真:FUNCTION_BLOCK FB_ProcessVAR_INPUT y : LREAL; Ta : LR
28、EAL; xOffset : LREAL; bInit : BOOL; bNoise : BOOL;END_VARVAR_OUTPUT x : LREAL;END_VARVAR KP1 : LREAL := 1.0; KP2 : LREAL := 1.0; T11 : LREAL := 1.0; T12 : LREAL := 10; iDeadTime : INT := 0; StreckeTeil1 : FB_P_T1; StreckeTeil2 : FB_P_T1; StreckeDeadtime : FB_DeadTime; StreckeNoise : DRAND;END_VARStreckeTeil1( bInit := bInit , fCycleTime := Ta, Kp
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1