FUNCTION_BLOCK BS_ModbusCom VAR_EXTERNAL END_VAR VAR_INPUT SerialCom : byte; NetSend : array[0..64] of NetSendConfig; NetSendDelay : time; ComSend : array[0..64] of ComSendConfig; ComSendDelay : time; (*系统默认t#200ms*) ComRecvDelay : time; (*系统默认t#120ms*) ComAnalysisDelay: time; (*系统默认t#150ms*) DataReadLength : int; END_VAR VAR_OUTPUT DataStr : array[0..128] of byte; DataRead : array[0..128] of DataFormat; END_VAR VAR SendFB : NW_SerSend; RecvFB : NW_SerRecv; SendP : pointer; RecvP : pointer; Send_act : bool; Recv_act : bool; i,j,k : int; i0,i1,i2,i3 : int; CRC16Lo1 : Byte; CRC16Hi1 : Byte; CRC16Lo : Byte; CRC16Hi : Byte; CL,CH : Byte; SaveHi,SaveLo : Byte; Flag : int; ENO_Count0 : dword; ENO_Count1 : dword; timer1 : ton; timer1_run : bool; NetVarSend1 : NetVarSend; t1 : ton; t1_in : bool; t1_q : bool; t2 : ton; t2_in : bool; t2_q : bool; t3 : ton; t3_in : bool; t3_q : bool; Commandsend : int; SendStr : array[0..8] of byte; RecvStr : array[0..200] of byte; CalcStr : array[0..200] of byte; ErrStr : array[0..100] of int; Recv_len : int; Recv_lenp : int; Recv_DataLen : int; Recv_CRCLo : int; Recv_CRCHi : int; TestMode : bool; StopMem : int; ComTimeoutCount : int; ComTimeoutClear : bool; checkmark1 : bool; checkmark2 : bool; checkmark3 : bool; checkmark4 : bool; DATA1 : int; DATA2 : int; TempStr : array[0..128] of byte; TempReal : real; v2v : NW_MemCopy; P1 : Pointer; P2 : Pointer; END_VAR (*Automatically declared*) VAR_EXTERNAL END_VAR (** {* **) (** ʱ �䣺20200915 **) (** �� ����1.3 **) (** �� �ߣ�Ҧ�� **) (** �� �ƣ�ͨѶ���ܿ� **) (** ˵ ���� **) (** ֧��ModbusЭ���03/04����Ķ�ȡ������ **) (** ֧�ֶ�ȡʧ�ܴ�����ѯ **) (** ֧�ֶ�ȡʧ����������������� **) (** ֧��ModbusЭ���06����ĵ����Ĵ���д�� **) (** ��һ��������ͨѶ��λ���� **) (** **) (** input ����˵�� **) (** **) (** SerialCom : byte; **) (** NetSend : array[0..64] of NetSendConfig; **) (** NetSendDelay : time; **) (** ComSend : array[0..64] of ComSendConfig; **) (** ComSendDelay : time; **) (** ComRecvDelay : time; **) (** ComAnalysisDelay: time; **) (** DataReadLength : int; **) (** DataType : array[0..256] of int ; **) (** **) (** output ���˵�� **) (** **) (** DataStr : array[0..256] of byte; **) (** DataRead : array[0..256] of DataFormat; **) (** **) (** config ��д���� **) (** **) (** ComSend[1].Enable :=1; ��ȡ����1 ����Ϊ0������Ϊ2������ʱ�����뱻�����������ж�; **) (** ComSend[1].EquipAddr :=1; �豸վ��0-255 **) (** ComSend[1].FunctionCode :=16#03; ������ Ŀǰ֧�� ��ȡHR��16#03����ȡAR��16#04 ��д��HR����16#06 **) (** ComSend[1].StartAddr :=2504; Modscan���Ե�ַ **) (** ComSend[1].Length :=12; ��ȡ�Ĵ������� **) (** ComSend[1].StartMem :=0; �����DataStr������ʼλ�ã�һ��Ϊǰһ���ݵ���ʼ��ַ+ǰһ���ݶ�ȡ�Ĵ�������*2 **) (** ComSend[1].WriteDataH1 :=0; д�����ݵĸ�λ����ȡʱ����Ҫ���� **) (** ComSend[1].WriteDataL1 :=WriteTestW; д�����ݵĵ�λ����ȡʱ����Ҫ���� **) (** **) (** read ��ȡ���� **) (** **) (** DataType[00]:=1; ������������ 1 int 2 float 3 byte 0 ���⣬���ݶ�ʱ������Ϊ0 **) (** **) (** DATA:=DataRead[00].TO_BYTE; �ֱ��Ӧ DataType 3 **) (** DATA:=DataRead[00].TO_REAL; �ֱ��Ӧ DataType 2 **) (** DATA:=DataRead[00].TO_INT; �ֱ��Ӧ DataType 1 **) (** **) (** **) (** �� ע�� **) (** ĿǰΪʾ��������δ��ɷ�װ�����Գ�������̨EXC5000C3�汾����CPU������������CPU����COM��Ϊ���ɿڣ���һCPU����COM��ΪModbus **) (** ����ʾ����ȡ����Ϊ���߷������MeterSim **) (** �����飺�� **) (** **) (** *} **) (** **) (** {**********************************************ͨѶ����**********************************************} **) (** {* **) (** �����ӳ�ʱ���ϵΪ����EXC1000COM��485��ȡ�������ٶ�Ϊ9600BPS���� **) (** ����̺��ӳ�����ͬ��������������ϵ�ο�Ŀǰ��ϵ **) (** �ӳ�ʱ������߲����ʣ��������豸��Ӧ�ٶ��йأ������ʵ��������� **) (** *} **) (** **) (** **) (** **) (** {********************************************����ͨѶ����********************************************} **) (** **) (** t1_in:=not t1.q; **) (* assign - Stmt *) LD t1.q NOT ST t1_in (** t1(IN :=t1_in , PT :=ComSendDelay ); **) (* call - Stmt *) CAL t1 ( IN := t1_in, PT := ComSendDelay ) (** t2(IN :=t1_in , PT :=ComRecvDelay ); **) (* call - Stmt *) CAL t2 ( IN := t1_in, PT := ComRecvDelay ) (** t3(IN :=t1_in , PT :=ComAnalysisDelay ); **) (* call - Stmt *) CAL t3 ( IN := t1_in, PT := ComAnalysisDelay ) (** **) (** if t1.q=0 and t1_q=1 then **) (* if - Cond *) LD t1.q EQ 0 AND ( t1_q EQ 1 ) JMPCN ODK_SKIP_000000000000001_000000000000001 (* then - Stmts *) (** Send_act:=1; **) (* assign - Stmt *) LD 1 ST Send_act JMP ODK_END_IF_000000000000001 (** else **) (* else *) ODK_SKIP_000000000000001_000000000000001: (* else - Stmts *) (** Send_act:=0; **) (* assign - Stmt *) LD 0 ST Send_act (** end_if; **) (* if - End *) ODK_END_IF_000000000000001: (** **) (** if t2.q=1 then **) (* if - Cond *) LD t2.q EQ 1 JMPCN ODK_SKIP_000000000000002_000000000000001 (* then - Stmts *) (** Recv_act:=1; **) (* assign - Stmt *) LD 1 ST Recv_act JMP ODK_END_IF_000000000000002 (** else **) (* else *) ODK_SKIP_000000000000002_000000000000001: (* else - Stmts *) (** Recv_act:=0; **) (* assign - Stmt *) LD 0 ST Recv_act (** end_if; **) (* if - End *) ODK_END_IF_000000000000002: (** **) (** if ComSend[1].Enable=1 then {*������λ�����õĻ���ʼִ�з�������*} **) (* if - Cond *) LD ComSend[1].Enable EQ 1 JMPCN ODK_SKIP_000000000000003_000000000000001 (* then - Stmts *) (** if Send_act=1 then **) (* if - Cond *) LD Send_act EQ 1 JMPCN ODK_SKIP_000000000000004_000000000000001 (* then - Stmts *) (** if TestMode=0 then **) (* if - Cond *) LD TestMode EQ 0 JMPCN ODK_SKIP_000000000000005_000000000000001 (* then - Stmts *) (** Commandsend:=Commandsend + 1; **) (* assign - Stmt *) LD Commandsend ADD 1 ST Commandsend JMP ODK_END_IF_000000000000005 (** end_if; **) (* if - End *) ODK_SKIP_000000000000005_000000000000001: ODK_END_IF_000000000000005: JMP ODK_END_IF_000000000000004 (** end_if; **) (* if - End *) ODK_SKIP_000000000000004_000000000000001: ODK_END_IF_000000000000004: (** if ComSend[Commandsend].Enable=0 then {*ִ�е�������λ����*} **) (* if - Cond *) LD ComSend[Commandsend].Enable EQ 0 JMPCN ODK_SKIP_000000000000006_000000000000001 (* then - Stmts *) (** Commandsend:=0; **) (* assign - Stmt *) LD 0 ST Commandsend JMP ODK_END_IF_000000000000006 (** end_if; **) (* if - End *) ODK_SKIP_000000000000006_000000000000001: ODK_END_IF_000000000000006: (** **) (** if ComSend[Commandsend].Enable=1 then **) (* if - Cond *) LD ComSend[Commandsend].Enable EQ 1 JMPCN ODK_SKIP_000000000000007_000000000000001 (* then - Stmts *) (** {*��ȡ����*} **) (** if ComSend[Commandsend].FunctionCode = 16#03 then **) (* if - Cond *) LD ComSend[Commandsend].FunctionCode EQ 16#03 JMPCN ODK_SKIP_000000000000008_000000000000001 (* then - Stmts *) (** SendStr[0]:=ComSend[Commandsend].EquipAddr;{*��ַ*} **) (* assign - Stmt *) LD ComSend[Commandsend].EquipAddr ST SendStr[0] (** SendStr[1]:=ComSend[Commandsend].FunctionCode;{*������*} **) (* assign - Stmt *) LD ComSend[Commandsend].FunctionCode ST SendStr[1] (** SendStr[2]:=int_to_byte((ComSend[Commandsend].StartAddr-1) / 256);{*��ʼ��ַ��λ*} **) (* assign - Stmt *) LD ComSend[Commandsend].StartAddr SUB 1 DIV 256 int_to_byte ST SendStr[2] (** SendStr[3]:=int_to_byte((ComSend[Commandsend].StartAddr-1) mod 256);{*��ʼ��ַ��λ*} **) (* assign - Stmt *) LD ComSend[Commandsend].StartAddr SUB 1 MOD 256 int_to_byte ST SendStr[3] (** SendStr[4]:=0;{*���ȸ�λ*} **) (* assign - Stmt *) LD 0 ST SendStr[4] (** SendStr[5]:=ComSend[Commandsend].Length;{*���ȵ�λ*} **) (* assign - Stmt *) LD ComSend[Commandsend].Length ST SendStr[5] JMP ODK_END_IF_000000000000008 (** end_if; **) (* if - End *) ODK_SKIP_000000000000008_000000000000001: ODK_END_IF_000000000000008: (** {*��ȡ����*} **) (** if ComSend[Commandsend].FunctionCode = 16#04 then **) (* if - Cond *) LD ComSend[Commandsend].FunctionCode EQ 16#04 JMPCN ODK_SKIP_000000000000009_000000000000001 (* then - Stmts *) (** SendStr[0]:=ComSend[Commandsend].EquipAddr;{*��ַ*} **) (* assign - Stmt *) LD ComSend[Commandsend].EquipAddr ST SendStr[0] (** SendStr[1]:=ComSend[Commandsend].FunctionCode;{*������*} **) (* assign - Stmt *) LD ComSend[Commandsend].FunctionCode ST SendStr[1] (** SendStr[2]:=int_to_byte((ComSend[Commandsend].StartAddr-1) / 256);{*��ʼ��ַ��λ*} **) (* assign - Stmt *) LD ComSend[Commandsend].StartAddr SUB 1 DIV 256 int_to_byte ST SendStr[2] (** SendStr[3]:=int_to_byte((ComSend[Commandsend].StartAddr-1) mod 256);{*��ʼ��ַ��λ*} **) (* assign - Stmt *) LD ComSend[Commandsend].StartAddr SUB 1 MOD 256 int_to_byte ST SendStr[3] (** SendStr[4]:=0;{*���ȸ�λ*} **) (* assign - Stmt *) LD 0 ST SendStr[4] (** SendStr[5]:=ComSend[Commandsend].Length;{*���ȵ�λ*} **) (* assign - Stmt *) LD ComSend[Commandsend].Length ST SendStr[5] JMP ODK_END_IF_000000000000009 (** end_if; **) (* if - End *) ODK_SKIP_000000000000009_000000000000001: ODK_END_IF_000000000000009: (** {*д������*} **) (** if ComSend[Commandsend].FunctionCode = 16#06 then **) (* if - Cond *) LD ComSend[Commandsend].FunctionCode EQ 16#06 JMPCN ODK_SKIP_00000000000000A_000000000000001 (* then - Stmts *) (** SendStr[0]:=ComSend[Commandsend].EquipAddr;{*��ַ*} **) (* assign - Stmt *) LD ComSend[Commandsend].EquipAddr ST SendStr[0] (** SendStr[1]:=ComSend[Commandsend].FunctionCode;{*������*} **) (* assign - Stmt *) LD ComSend[Commandsend].FunctionCode ST SendStr[1] (** SendStr[2]:=int_to_byte((ComSend[Commandsend].StartAddr-1) / 256);{*��ʼ��ַ��λ*} **) (* assign - Stmt *) LD ComSend[Commandsend].StartAddr SUB 1 DIV 256 int_to_byte ST SendStr[2] (** SendStr[3]:=int_to_byte((ComSend[Commandsend].StartAddr-1) mod 256);{*��ʼ��ַ��λ*} **) (* assign - Stmt *) LD ComSend[Commandsend].StartAddr SUB 1 MOD 256 int_to_byte ST SendStr[3] (** SendStr[4]:=ComSend[Commandsend].WriteDataH1; **) (* assign - Stmt *) LD ComSend[Commandsend].WriteDataH1 ST SendStr[4] (** SendStr[5]:=ComSend[Commandsend].WriteDataL1; **) (* assign - Stmt *) LD ComSend[Commandsend].WriteDataL1 ST SendStr[5] JMP ODK_END_IF_00000000000000A (** end_if; **) (* if - End *) ODK_SKIP_00000000000000A_000000000000001: ODK_END_IF_00000000000000A: JMP ODK_END_IF_000000000000007 (** end_if; **) (* if - End *) ODK_SKIP_000000000000007_000000000000001: ODK_END_IF_000000000000007: (** **) (** if ComSend[Commandsend].Enable=2 then **) (* if - Cond *) LD ComSend[Commandsend].Enable EQ 2 JMPCN ODK_SKIP_00000000000000B_000000000000001 (* then - Stmts *) (** SendStr[0]:= 16#00 ; **) (* assign - Stmt *) LD 16#00 ST SendStr[0] (** SendStr[1]:= 16#00 ; **) (* assign - Stmt *) LD 16#00 ST SendStr[1] (** SendStr[2]:= 16#00 ; **) (* assign - Stmt *) LD 16#00 ST SendStr[2] (** SendStr[3]:= 16#00 ; **) (* assign - Stmt *) LD 16#00 ST SendStr[3] (** SendStr[4]:= 16#00 ; **) (* assign - Stmt *) LD 16#00 ST SendStr[4] (** SendStr[5]:= 16#00 ; **) (* assign - Stmt *) LD 16#00 ST SendStr[5] JMP ODK_END_IF_00000000000000B (** end_if; **) (* if - End *) ODK_SKIP_00000000000000B_000000000000001: ODK_END_IF_00000000000000B: (** **) (** {*CRCУ��*} **) (** CRC16Lo := 255; **) (* assign - Stmt *) LD 255 ST CRC16Lo (** CRC16Hi := 255; **) (* assign - Stmt *) LD 255 ST CRC16Hi (** CL := 1; **) (* assign - Stmt *) LD 1 ST CL (** CH := 160; **) (* assign - Stmt *) LD 160 ST CH (** **) (** for i := 0 To 5 by 1 do **) (* for - Init *) LD 0 ST i EQ 5 JMPC ODK_FOR_STMTS_00000000000000C (* for - Cond *) ODK_FOR_00000000000000C: LD 0 GT 5 JMPC ODK_FOR_DOWN_00000000000000C LD 0 GT 1 JMPC ODK_END_FOR_00000000000000C LD 5 LT i JMPC ODK_END_FOR_00000000000000C JMP ODK_FOR_STMTS_00000000000000C ODK_FOR_DOWN_00000000000000C: LD 5 GT i JMPC ODK_END_FOR_00000000000000C LD 0 LT 1 JMPC ODK_END_FOR_00000000000000C (* for - Stmts *) ODK_FOR_STMTS_00000000000000C: (** CRC16Lo := CRC16Lo xor SendStr[i]; **) (* assign - Stmt *) LD CRC16Lo XOR SendStr[i] ST CRC16Lo (** for Flag := 0 to 7 by 1 do **) (* for - Init *) LD 0 ST Flag EQ 7 JMPC ODK_FOR_STMTS_00000000000000D (* for - Cond *) ODK_FOR_00000000000000D: LD 0 GT 7 JMPC ODK_FOR_DOWN_00000000000000D LD 0 GT 1 JMPC ODK_END_FOR_00000000000000D LD 7 LT Flag JMPC ODK_END_FOR_00000000000000D JMP ODK_FOR_STMTS_00000000000000D ODK_FOR_DOWN_00000000000000D: LD 7 GT Flag JMPC ODK_END_FOR_00000000000000D LD 0 LT 1 JMPC ODK_END_FOR_00000000000000D (* for - Stmts *) ODK_FOR_STMTS_00000000000000D: (** SaveHi := CRC16Hi; **) (* assign - Stmt *) LD CRC16Hi ST SaveHi (** SaveLo := CRC16Lo; **) (* assign - Stmt *) LD CRC16Lo ST SaveLo (** CRC16Hi := shr(CRC16Hi,1); **) (* assign - Stmt *) LD CRC16Hi shr 1 ST CRC16Hi (** CRC16Lo := shr(CRC16Lo,1); **) (* assign - Stmt *) LD CRC16Lo shr 1 ST CRC16Lo (** **) (** if ((SaveHi and 1) = 1) then **) (* if - Cond *) LD SaveHi AND 1 EQ 1 JMPCN ODK_SKIP_00000000000000E_000000000000001 (* then - Stmts *) (** CRC16Lo := CRC16Lo Or 128; **) (* assign - Stmt *) LD CRC16Lo OR 128 ST CRC16Lo JMP ODK_END_IF_00000000000000E (** end_If; **) (* if - End *) ODK_SKIP_00000000000000E_000000000000001: ODK_END_IF_00000000000000E: (** If ((SaveLo and 1) = 1) then **) (* if - Cond *) LD SaveLo AND 1 EQ 1 JMPCN ODK_SKIP_00000000000000F_000000000000001 (* then - Stmts *) (** CRC16Hi := CRC16Hi xor CH; **) (* assign - Stmt *) LD CRC16Hi XOR CH ST CRC16Hi (** CRC16Lo := CRC16Lo xor CL; **) (* assign - Stmt *) LD CRC16Lo XOR CL ST CRC16Lo JMP ODK_END_IF_00000000000000F (** end_if; **) (* if - End *) ODK_SKIP_00000000000000F_000000000000001: ODK_END_IF_00000000000000F: (* for - By *) LD 1 ADD Flag ST Flag (** end_for; **) JMP ODK_FOR_00000000000000D (* for - End *) ODK_END_FOR_00000000000000D: (* for - By *) LD 1 ADD i ST i (** end_for; **) JMP ODK_FOR_00000000000000C (* for - End *) ODK_END_FOR_00000000000000C: (** **) (** SendStr[6]:=CRC16Lo; **) (* assign - Stmt *) LD CRC16Lo ST SendStr[6] (** SendStr[7]:=CRC16Hi; **) (* assign - Stmt *) LD CRC16Hi ST SendStr[7] JMP ODK_END_IF_000000000000003 (** **) (** end_if; **) (* if - End *) ODK_SKIP_000000000000003_000000000000001: ODK_END_IF_000000000000003: (** **) (** **) (** if t3.q=1 then **) (* if - Cond *) LD t3.q EQ 1 JMPCN ODK_SKIP_00000000000000G_000000000000001 (* then - Stmts *) (** **) (** {*�������ݴ���*} **) (** if Recv_len>=6 then{*�з���*} **) (* if - Cond *) LD Recv_len GE 6 JMPCN ODK_SKIP_00000000000000H_000000000000001 (* then - Stmts *) (** Recv_lenp :=Recv_len-3;{*ȥ��У��λ-2,0��ʼ-1*} **) (* assign - Stmt *) LD Recv_len SUB 3 ST Recv_lenp (** **) (** CRC16Lo := 255; **) (* assign - Stmt *) LD 255 ST CRC16Lo (** CRC16Hi := 255; **) (* assign - Stmt *) LD 255 ST CRC16Hi (** CL := 1; **) (* assign - Stmt *) LD 1 ST CL (** CH := 160; **) (* assign - Stmt *) LD 160 ST CH (** **) (** for i := 0 To Recv_lenp by 1 do **) (* for - Init *) LD 0 ST i EQ Recv_lenp JMPC ODK_FOR_STMTS_00000000000000I (* for - Cond *) ODK_FOR_00000000000000I: LD 0 GT Recv_lenp JMPC ODK_FOR_DOWN_00000000000000I LD 0 GT 1 JMPC ODK_END_FOR_00000000000000I LD Recv_lenp LT i JMPC ODK_END_FOR_00000000000000I JMP ODK_FOR_STMTS_00000000000000I ODK_FOR_DOWN_00000000000000I: LD Recv_lenp GT i JMPC ODK_END_FOR_00000000000000I LD 0 LT 1 JMPC ODK_END_FOR_00000000000000I (* for - Stmts *) ODK_FOR_STMTS_00000000000000I: (** CRC16Lo := CRC16Lo xor RecvStr[i]; **) (* assign - Stmt *) LD CRC16Lo XOR RecvStr[i] ST CRC16Lo (** for Flag := 0 to 7 by 1 do **) (* for - Init *) LD 0 ST Flag EQ 7 JMPC ODK_FOR_STMTS_00000000000000J (* for - Cond *) ODK_FOR_00000000000000J: LD 0 GT 7 JMPC ODK_FOR_DOWN_00000000000000J LD 0 GT 1 JMPC ODK_END_FOR_00000000000000J LD 7 LT Flag JMPC ODK_END_FOR_00000000000000J JMP ODK_FOR_STMTS_00000000000000J ODK_FOR_DOWN_00000000000000J: LD 7 GT Flag JMPC ODK_END_FOR_00000000000000J LD 0 LT 1 JMPC ODK_END_FOR_00000000000000J (* for - Stmts *) ODK_FOR_STMTS_00000000000000J: (** SaveHi := CRC16Hi; **) (* assign - Stmt *) LD CRC16Hi ST SaveHi (** SaveLo := CRC16Lo; **) (* assign - Stmt *) LD CRC16Lo ST SaveLo (** CRC16Hi := shr(CRC16Hi,1); **) (* assign - Stmt *) LD CRC16Hi shr 1 ST CRC16Hi (** CRC16Lo := shr(CRC16Lo,1); **) (* assign - Stmt *) LD CRC16Lo shr 1 ST CRC16Lo (** **) (** if ((SaveHi and 1) = 1) then **) (* if - Cond *) LD SaveHi AND 1 EQ 1 JMPCN ODK_SKIP_00000000000000K_000000000000001 (* then - Stmts *) (** CRC16Lo := CRC16Lo Or 128; **) (* assign - Stmt *) LD CRC16Lo OR 128 ST CRC16Lo JMP ODK_END_IF_00000000000000K (** end_If; **) (* if - End *) ODK_SKIP_00000000000000K_000000000000001: ODK_END_IF_00000000000000K: (** If ((SaveLo and 1) = 1) then **) (* if - Cond *) LD SaveLo AND 1 EQ 1 JMPCN ODK_SKIP_00000000000000L_000000000000001 (* then - Stmts *) (** CRC16Hi := CRC16Hi xor CH; **) (* assign - Stmt *) LD CRC16Hi XOR CH ST CRC16Hi (** CRC16Lo := CRC16Lo xor CL; **) (* assign - Stmt *) LD CRC16Lo XOR CL ST CRC16Lo JMP ODK_END_IF_00000000000000L (** end_if; **) (* if - End *) ODK_SKIP_00000000000000L_000000000000001: ODK_END_IF_00000000000000L: (* for - By *) LD 1 ADD Flag ST Flag (** end_for; **) JMP ODK_FOR_00000000000000J (* for - End *) ODK_END_FOR_00000000000000J: (* for - By *) LD 1 ADD i ST i (** end_for; **) JMP ODK_FOR_00000000000000I (* for - End *) ODK_END_FOR_00000000000000I: (** CRC16Hi1:=CRC16Hi; **) (* assign - Stmt *) LD CRC16Hi ST CRC16Hi1 (** CRC16Lo1:=CRC16Lo; **) (* assign - Stmt *) LD CRC16Lo ST CRC16Lo1 (** **) (** Recv_CRCLo:=Recv_lenp+1; **) (* assign - Stmt *) LD Recv_lenp ADD 1 ST Recv_CRCLo (** Recv_CRCHi:=Recv_lenp+2; **) (* assign - Stmt *) LD Recv_lenp ADD 2 ST Recv_CRCHi (** **) (** {* **) (** funtionCode03 **) (** Tx �豸��ַ 03 ��ʼ��ַ��λ ��ʼ��ַ��λ �Ĵ���������λ �Ĵ���������λ CRCH CRCL **) (** Rx �豸��ַ 03 �ֽ��� �Ĵ���1��λ �Ĵ���1��λ... CRCH CRCL **) (** Recv_DataLen =(RecvStr[2])-1 ����Ϊ���ݳ���=���ֽ��������ֽ����պ���RecvStr[2]��-1��i��0��ʼ������-1�� **) (** j = i+3 ����Ϊ����λ�Ǵӵ�3λ֮��ʼ�� **) (** **) (** funtionCode06 **) (** Tx �豸��ַ 06 ��ʼ��ַ��λ ��ʼ��ַ��λ �Ĵ���ֵ��λ �Ĵ���ֵ��λ CRCH CRCL **) (** Rx �豸��ַ 06 ��ʼ��ַ��λ ��ʼ��ַ��λ �Ĵ���ֵ��λ �Ĵ���ֵ��λ CRCH CRCL **) (** Recv_DataLen =(RecvStr[2])-1 ����Ϊ���ݳ���=2�������Ĵ�����ȡֻ��2λ��-1��i��0��ʼ������-1�� **) (** j = i+4 ����Ϊ����λ�Ǵӵ�4λ֮��ʼ�� **) (** **) (** *} **) (** if ComSend[Commandsend].FunctionCode = 16#03 or ComSend[Commandsend].FunctionCode = 16#04 then **) (* if - Cond *) LD ComSend[Commandsend].FunctionCode EQ 16#03 OR ( ComSend[Commandsend].FunctionCode EQ 16#04 ) JMPCN ODK_SKIP_00000000000000M_000000000000001 (* then - Stmts *) (** Recv_DataLen:=byte_to_int(RecvStr[2])-1; **) (* assign - Stmt *) LD RecvStr[2] byte_to_int SUB 1 ST Recv_DataLen JMP ODK_END_IF_00000000000000M (** end_if; **) (* if - End *) ODK_SKIP_00000000000000M_000000000000001: ODK_END_IF_00000000000000M: (** if ComSend[Commandsend].FunctionCode = 16#06 then **) (* if - Cond *) LD ComSend[Commandsend].FunctionCode EQ 16#06 JMPCN ODK_SKIP_00000000000000N_000000000000001 (* then - Stmts *) (** Recv_DataLen:=1; **) (* assign - Stmt *) LD 1 ST Recv_DataLen JMP ODK_END_IF_00000000000000N (** end_if; **) (* if - End *) ODK_SKIP_00000000000000N_000000000000001: ODK_END_IF_00000000000000N: (** if Commandsend<>0 then **) (* if - Cond *) LD Commandsend NE 0 JMPCN ODK_SKIP_00000000000000O_000000000000001 (* then - Stmts *) (** if RecvStr[Recv_CRCLo]=CRC16Lo and RecvStr[Recv_CRCHi]=CRC16Hi then{*У����ȷ*} **) (* if - Cond *) LD RecvStr[Recv_CRCLo] EQ CRC16Lo AND ( RecvStr[Recv_CRCHi] EQ CRC16Hi ) JMPCN ODK_SKIP_00000000000000P_000000000000001 (* then - Stmts *) (** **) (** for i:=0 to Recv_DataLen by 1 do **) (* for - Init *) LD 0 ST i EQ Recv_DataLen JMPC ODK_FOR_STMTS_00000000000000Q (* for - Cond *) ODK_FOR_00000000000000Q: LD 0 GT Recv_DataLen JMPC ODK_FOR_DOWN_00000000000000Q LD 0 GT 1 JMPC ODK_END_FOR_00000000000000Q LD Recv_DataLen LT i JMPC ODK_END_FOR_00000000000000Q JMP ODK_FOR_STMTS_00000000000000Q ODK_FOR_DOWN_00000000000000Q: LD Recv_DataLen GT i JMPC ODK_END_FOR_00000000000000Q LD 0 LT 1 JMPC ODK_END_FOR_00000000000000Q (* for - Stmts *) ODK_FOR_STMTS_00000000000000Q: (** if ComSend[Commandsend].FunctionCode = 16#03 or ComSend[Commandsend].FunctionCode = 16#04 then **) (* if - Cond *) LD ComSend[Commandsend].FunctionCode EQ 16#03 OR ( ComSend[Commandsend].FunctionCode EQ 16#04 ) JMPCN ODK_SKIP_00000000000000R_000000000000001 (* then - Stmts *) (** j:=i+3; **) (* assign - Stmt *) LD i ADD 3 ST j JMP ODK_END_IF_00000000000000R (** end_if; **) (* if - End *) ODK_SKIP_00000000000000R_000000000000001: ODK_END_IF_00000000000000R: (** if ComSend[Commandsend].FunctionCode = 16#06 then **) (* if - Cond *) LD ComSend[Commandsend].FunctionCode EQ 16#06 JMPCN ODK_SKIP_00000000000000S_000000000000001 (* then - Stmts *) (** j:=i+4; **) (* assign - Stmt *) LD i ADD 4 ST j JMP ODK_END_IF_00000000000000S (** end_if; **) (* if - End *) ODK_SKIP_00000000000000S_000000000000001: ODK_END_IF_00000000000000S: (** if (SendStr[2]=int_to_byte((ComSend[Commandsend].StartAddr-1) / 256)) and (SendStr[3]=int_to_byte((ComSend[Commandsend].StartAddr-1) mod 256) )and (SendStr[1]=ComSend[Commandsend].FunctionCode) then{*������*} **) (* if - Cond *) LD SendStr[2] EQ ( ComSend[Commandsend].StartAddr SUB 1 DIV 256 int_to_byte ) AND ( SendStr[3] EQ ( ComSend[Commandsend].StartAddr SUB 1 MOD 256 int_to_byte ) ) AND ( SendStr[1] EQ ComSend[Commandsend].FunctionCode ) JMPCN ODK_SKIP_00000000000000T_000000000000001 (* then - Stmts *) (** CalcStr[i]:=RecvStr[j]; **) (* assign - Stmt *) LD RecvStr[j] ST CalcStr[i] (** k:=ComSend[Commandsend].StartMem+i; **) (* assign - Stmt *) LD ComSend[Commandsend].StartMem ADD i ST k (** DataStr[k]:=CalcStr[i]; **) (* assign - Stmt *) LD CalcStr[i] ST DataStr[k] JMP ODK_END_IF_00000000000000T (** end_if; **) (* if - End *) ODK_SKIP_00000000000000T_000000000000001: ODK_END_IF_00000000000000T: (* for - By *) LD 1 ADD i ST i (** end_for; **) JMP ODK_FOR_00000000000000Q (* for - End *) ODK_END_FOR_00000000000000Q: (** ErrStr[commandsend]:=0; **) (* assign - Stmt *) LD 0 ST ErrStr[Commandsend] JMP ODK_END_IF_00000000000000P (** else **) (* else *) ODK_SKIP_00000000000000P_000000000000001: (* else - Stmts *) (** {*�����ۼ�*} **) (** ErrStr[Commandsend]:=ErrStr[Commandsend]+1; **) (* assign - Stmt *) LD ErrStr[Commandsend] ADD 1 ST ErrStr[Commandsend] (** if ErrStr[Commandsend]>999 then **) (* if - Cond *) LD ErrStr[Commandsend] GT 999 JMPCN ODK_SKIP_00000000000000U_000000000000001 (* then - Stmts *) (** ErrStr[Commandsend]:=999; **) (* assign - Stmt *) LD 999 ST ErrStr[Commandsend] JMP ODK_END_IF_00000000000000U (** end_if; **) (* if - End *) ODK_SKIP_00000000000000U_000000000000001: ODK_END_IF_00000000000000U: (** end_if; **) (* if - End *) ODK_END_IF_00000000000000P: JMP ODK_END_IF_00000000000000O (** end_if; **) (* if - End *) ODK_SKIP_00000000000000O_000000000000001: ODK_END_IF_00000000000000O: (** {*��ս���*} **) (** for i:=0 to 200 by 1 do **) (* for - Init *) LD 0 ST i EQ 200 JMPC ODK_FOR_STMTS_00000000000000V (* for - Cond *) ODK_FOR_00000000000000V: LD 0 GT 200 JMPC ODK_FOR_DOWN_00000000000000V LD 0 GT 1 JMPC ODK_END_FOR_00000000000000V LD 200 LT i JMPC ODK_END_FOR_00000000000000V JMP ODK_FOR_STMTS_00000000000000V ODK_FOR_DOWN_00000000000000V: LD 200 GT i JMPC ODK_END_FOR_00000000000000V LD 0 LT 1 JMPC ODK_END_FOR_00000000000000V (* for - Stmts *) ODK_FOR_STMTS_00000000000000V: (** RecvStr[i]:=0; **) (* assign - Stmt *) LD 0 ST RecvStr[i] (** CalcStr[i]:=0; **) (* assign - Stmt *) LD 0 ST CalcStr[i] (* for - By *) LD 1 ADD i ST i (** end_for; **) JMP ODK_FOR_00000000000000V (* for - End *) ODK_END_FOR_00000000000000V: (** **) (** {*�����ۼƳ�ʱ���������*} **) (** if ErrStr[Commandsend]>ComTimeoutCount and ComTimeoutClear=1 then **) (* if - Cond *) LD ErrStr[Commandsend] GT ComTimeoutCount AND ( ComTimeoutClear EQ 1 ) JMPCN ODK_SKIP_00000000000000W_000000000000001 (* then - Stmts *) (** StopMem:=ComSend[Commandsend].StartMem+byte_to_int(ComSend[Commandsend].Length); **) (* assign - Stmt *) LD ComSend[Commandsend].StartMem ADD ( ComSend[Commandsend].Length byte_to_int ) ST StopMem (** for i:=ComSend[Commandsend].StartMem to StopMem by 1 do **) (* for - Init *) LD ComSend[Commandsend].StartMem ST i EQ StopMem JMPC ODK_FOR_STMTS_00000000000000X (* for - Cond *) ODK_FOR_00000000000000X: LD ComSend[Commandsend].StartMem GT StopMem JMPC ODK_FOR_DOWN_00000000000000X LD 0 GT 1 JMPC ODK_END_FOR_00000000000000X LD StopMem LT i JMPC ODK_END_FOR_00000000000000X JMP ODK_FOR_STMTS_00000000000000X ODK_FOR_DOWN_00000000000000X: LD StopMem GT i JMPC ODK_END_FOR_00000000000000X LD 0 LT 1 JMPC ODK_END_FOR_00000000000000X (* for - Stmts *) ODK_FOR_STMTS_00000000000000X: (** DataStr[i]:=0; **) (* assign - Stmt *) LD 0 ST DataStr[i] (* for - By *) LD 1 ADD i ST i (** end_for; **) JMP ODK_FOR_00000000000000X (* for - End *) ODK_END_FOR_00000000000000X: JMP ODK_END_IF_00000000000000W (** end_if; **) (* if - End *) ODK_SKIP_00000000000000W_000000000000001: ODK_END_IF_00000000000000W: JMP ODK_END_IF_00000000000000H (** **) (** end_if; **) (* if - End *) ODK_SKIP_00000000000000H_000000000000001: ODK_END_IF_00000000000000H: JMP ODK_END_IF_00000000000000G (** **) (** end_if; **) (* if - End *) ODK_SKIP_00000000000000G_000000000000001: ODK_END_IF_00000000000000G: (** **) (** **) (** **) (** **) (** SendP:=&SendStr; **) (* assign - Stmt *) LD &SendStr ST SendP (** RecvP:=&RecvStr; **) (* assign - Stmt *) LD &RecvStr ST RecvP (** SendFB(EN :=Send_act , COM :=SerialCom , DATA :=SendP , LENGTH :=8 , IQM :=0 ); **) (* call - Stmt *) CAL SendFB ( EN := Send_act, COM := SerialCom, DATA := SendP, Length := 8, IQM := 0 ) (** RecvFB(EN :=Recv_act , COM :=SerialCom , DATA :=RecvP , IQM :=0 | Recv_len:= LENGTH); **) (* call - Stmt *) CAL RecvFB ( EN := Recv_act, COM := SerialCom, DATA := RecvP, IQM := 0 | Recv_len := Length ) (** **) (** t1_q:=t1.q; **) (* assign - Stmt *) LD t1.q ST t1_q (** t2_q:=t2.q; **) (* assign - Stmt *) LD t2.q ST t2_q (** t3_q:=t3.q; **) (* assign - Stmt *) LD t3.q ST t3_q (** **) (** {********************************************���ݴ���********************************************} **) (** **) (** for i := 0 To DataReadLength by 1 do **) (* for - Init *) LD 0 ST i EQ DataReadLength JMPC ODK_FOR_STMTS_00000000000000Y (* for - Cond *) ODK_FOR_00000000000000Y: LD 0 GT DataReadLength JMPC ODK_FOR_DOWN_00000000000000Y LD 0 GT 1 JMPC ODK_END_FOR_00000000000000Y LD DataReadLength LT i JMPC ODK_END_FOR_00000000000000Y JMP ODK_FOR_STMTS_00000000000000Y ODK_FOR_DOWN_00000000000000Y: LD DataReadLength GT i JMPC ODK_END_FOR_00000000000000Y LD 0 LT 1 JMPC ODK_END_FOR_00000000000000Y (* for - Stmts *) ODK_FOR_STMTS_00000000000000Y: (** **) (** {* Type Ϊ0ʱȫ��*} **) (** **) (** i0:=i; **) (* assign - Stmt *) LD i ST i0 (** i1:=i+1; **) (* assign - Stmt *) LD i ADD 1 ST i1 (** i2:=i+2; **) (* assign - Stmt *) LD i ADD 2 ST i2 (** i3:=i+3; **) (* assign - Stmt *) LD i ADD 3 ST i3 (** **) (** {* 1 int *} **) (** DataRead[i].TO_INT:=byte_to_int(DataStr[i0])*256+byte_to_int(DataStr[i1]); **) (* assign - Stmt *) LD DataStr[i0] byte_to_int MUL 256 ADD ( DataStr[i1] byte_to_int ) ST DataRead[i].TO_INT (** **) (** {* 2 Float *} **) (** TempStr[0]:=DataStr[i1]; **) (* assign - Stmt *) LD DataStr[i1] ST TempStr[0] (** TempStr[1]:=DataStr[i0]; **) (* assign - Stmt *) LD DataStr[i0] ST TempStr[1] (** TempStr[2]:=DataStr[i3]; **) (* assign - Stmt *) LD DataStr[i3] ST TempStr[2] (** TempStr[3]:=DataStr[i2]; **) (* assign - Stmt *) LD DataStr[i2] ST TempStr[3] (** P1:=&TempStr; **) (* assign - Stmt *) LD &TempStr ST P1 (** P2:=&TempReal; **) (* assign - Stmt *) LD &TempReal ST P2 (** v2v(DEST :=P2 , SRC :=P1 , LENGTH :=4 , IQM :=0 ); **) (* call - Stmt *) CAL v2v ( DEST := P2, SRC := P1, Length := 4, IQM := 0 ) (** DataRead[i].TO_REAL:=TempReal; **) (* assign - Stmt *) LD TempReal ST DataRead[i].TO_REAL (** **) (** {* 3 byte *} **) (** DataRead[i].TO_BYTE:=1; **) (* assign - Stmt *) LD 1 ST DataRead[i].TO_BYTE (* for - By *) LD 1 ADD i ST i (** **) (** end_for; **) JMP ODK_FOR_00000000000000Y (* for - End *) ODK_END_FOR_00000000000000Y: (** **) (** {* �˶ν�����ʽ�Ϻ�ᵼ�´�λ����ʱ��ʱ����ԭ�� **) (** for i := 0 To DataReadLength by 1 do **) (** **) (** if DataType[i]=1 or DataType[i]=0 then **) (** i0:=i; **) (** i1:=i+1; **) (** DataRead[i].TO_INT:=byte_to_int(DataStr[i0])*256+byte_to_int(DataStr[i1]); **) (** end_if; **) (** **) (** if DataType[i]=2 or DataType[i]=0 then **) (** i0:=i; **) (** i1:=i+1; **) (** i2:=i+2; **) (** i3:=i+3; **) (** TempStr[0]:=DataStr[i1]; **) (** TempStr[1]:=DataStr[i0]; **) (** TempStr[2]:=DataStr[i3]; **) (** TempStr[3]:=DataStr[i2]; **) (** P1:=&TempStr; **) (** P2:=&TempReal; **) (** v2v(DEST :=P2 , SRC :=P1 , LENGTH :=4 , IQM :=0 ); **) (** DataRead[i].TO_REAL:=TempReal; **) (** end_if; **) (** **) (** if DataType[i]=3 or DataType[i]=0 then **) (** i0:=i; **) (** DataRead[i].TO_BYTE:=DataStr[i]; **) (** end_if; **) (** **) (** 4 BCD **) (** if DataType[i]=4 or DataType[i]=0 then **) (** i0:=i; **) (** i1:=i+1; **) (** k1:=byte_to_int(DataStr[i0])*256+byte_to_int(DataStr[i1]); **) (** DataRead[i].TO_BCD01:=int_to_bool( k1 Mod 2#0000000000000001 ); **) (** DataRead[i].TO_BCD02:=int_to_bool( k1 Mod 2#0000000000000010 ); **) (** DataRead[i].TO_BCD03:=int_to_bool( k1 Mod 2#0000000000000100 ); **) (** DataRead[i].TO_BCD04:=int_to_bool( k1 Mod 2#0000000000001000 ); **) (** DataRead[i].TO_BCD05:=int_to_bool( k1 Mod 2#0000000000010000 ); **) (** DataRead[i].TO_BCD06:=int_to_bool( k1 Mod 2#0000000000100000 ); **) (** DataRead[i].TO_BCD07:=int_to_bool( k1 Mod 2#0000000001000000 ); **) (** DataRead[i].TO_BCD08:=int_to_bool( k1 Mod 2#0000000010000000 ); **) (** DataRead[i].TO_BCD09:=int_to_bool( k1 Mod 2#0000000100000000 ); **) (** DataRead[i].TO_BCD10:=int_to_bool( k1 Mod 2#0000001000000000 ); **) (** DataRead[i].TO_BCD11:=int_to_bool( k1 Mod 2#0000010000000000 ); **) (** DataRead[i].TO_BCD12:=int_to_bool( k1 Mod 2#0000100000000000 ); **) (** DataRead[i].TO_BCD13:=int_to_bool( k1 Mod 2#0001000000000000 ); **) (** DataRead[i].TO_BCD14:=int_to_bool( k1 Mod 2#0010000000000000 ); **) (** DataRead[i].TO_BCD15:=int_to_bool( k1 Mod 2#0100000000000000 ); **) (** DataRead[i].TO_BCD16:=int_to_bool( k1 Mod 2#1000000000000000 ); **) (** **) (** end_if; **) (** *} **) (** **) END_FUNCTION_BLOCK