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