You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

1662 lines
34 KiB

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