s7-scl-gen
Version:
S7 PLC SCL 代码自动生成
163 lines (156 loc) • 6.22 kB
YAML
name: test-CPU
symbols:
- [Clock_Byte, MB0]
name: test-SC
description:
includes: |
FUNCTION_BLOCK "write_SC"
TITLE='MB写命令'
VERSION:'1.0'
AUTHOR:Goosy
NAME:writeB
FAMILY:GooLib
VAR_INPUT
r_work_F : BOOL ; // 设备正常指示
r_invalid : BOOL ; // 设备无效指示
r_on_receive : BOOL ; // 设备接收指示
r_unit_ID : BYTE ; // 设备号
r_func_code : BYTE ; // modbus功能号
r_length : BYTE ; // 接收长度
r_B0 : BYTE ; // 接收字节
r_B1 : BYTE ; // 接收字节 CRC_H
r_B2 : BYTE ; // 接收字节 CRC_L
r_B3 : BYTE ; // 保留
w_work_F : BOOL ; // 设备正常指示
w_invalid : BOOL ; // 设备无效指示
w_on_receive : BOOL ; // 设备接收指示
w_unit_ID : BYTE ; // 设备号
w_func_code : BYTE ; // modbus功能号
start_H : BYTE ; // 写起始高字节
start_L : BYTE ; // 写起始低字节
len_H : BYTE ; // 写数量高字节
len_L : BYTE ; // 写数量低字节
w_CRC_H : BYTE ; // CRC16
w_CRC_L : BYTE ; // CRC16
CH : ARRAY[1..8] OF BOOL; // QB0 数据
B0 AT CH : BYTE; // QB0 数据
END_VAR
VAR_OUTPUT
bytes_count : INT := 10; // 总字节数
unit_ID : BYTE := B#16#4; // 子站地址
func_code : BYTE := B#16#F; // modbus 功能号,15写多个线圈
start : INT := 0; // 起始地址
length : INT := 8; // 数据长度
betys : BYTE := B#16#1; // 字节数
data : BYTE := B#16#0; // 数据
CRC_H : BYTE ; // CRC16
CRC_L : BYTE ; // CRC16
END_VAR
VAR_IN_OUT
writing : BOOL; //正在写
END_VAR
BEGIN
IF B0 <> r_B0 THEN
data := B0;
writing := TRUE;
END_IF;
END_FUNCTION_BLOCK
DATA_BLOCK "EDO02" "write_SC"
BEGIN
END_DATA_BLOCK
// 设备数据接收DB块,可根据设备定义多个接收DB块
// 本例"rdata_SC"的DB号为53,在其中定义了4个设备的数据,依据实际增减
// 建议一个设备只定义在一个DB中,本例一个DB定义多个设备仅为了展示可以这样组织
DATA_BLOCK "rdata_SC"
STRUCT
device0_workOK : BOOL; //设备正常指示 0
device0_error : BOOL; //设备错误指示
device0_on_receive : BOOL; //设备接收指示
device0_deviceID : BYTE; //设备号
device0_funcNo : BYTE; //modbus功能号
device0_len : BYTE; //长度
device0_data : ARRAY[4..31] OF BYTE; //数值
device1_workOK : BOOL; //设备正常指示
device1_error : BOOL; //设备错误指示
device1_on_receive : BOOL; //设备接收指示
device1_deviceID : BYTE; //设备号
device1_funcNo : BYTE; //modbus功能号
device1_len : BYTE; //长度
device1_data : ARRAY[36..63] OF BYTE; //数值
device2_workOK : BOOL; //设备正常指示
device2_error : BOOL; //设备错误指示
device2_on_receive : BOOL; //设备接收指示
device2_deviceID : BYTE; //设备号
device2_funcNo : BYTE; //modbus功能号
device2_len : BYTE; //长度
device2_data : ARRAY[68..95] OF BYTE; //数值
device3_workOK : BOOL; //设备正常指示
device3_error : BOOL; //设备错误指示
device3_on_receive : BOOL; //设备接收指示
device3_data0 : BYTE;
device3_data : ARRAY[98..127] OF BYTE; //数值
device4_workOK : BOOL; //设备正常指示 30
device4_error : BOOL; //设备错误指示
device4_on_receive : BOOL; //设备接收指示
device4_data0 : BYTE;
device4_data : ARRAY[130..159] OF BYTE; //数值
END_STRUCT;
BEGIN
END_DATA_BLOCK
symbols:
- [SC_polls_DB, DB880]
- [count, MW20, INT]
- [CRC16, FC16, ~, modbus CRC16 校验]
- [write_SC, FB811]
- [rdata_SC, DB53]
- [EDO02, DB32, write_SC]
list : # CP 模块列表
- comment: CP01 256
type: CP341
module_addr: 256
DB: [CP01, DB10]
polls:
- comment: 第1个poll modbus协议
mode: continuous # 连续模式。可省略,默认模式
unit_ID: 1 # 有该参数时,表示该poll为modbus协议
func_code: 3
address: 0
length: 12
# 配置项允许16进制字符串
recv_DB: rdata_SC
recv_start: 0
- comment: 第2个poll 周期发送
mode: periodicity # 周期模式
timeout: 1000 # 指定同期,单位ms,默认 2000ms
unit_ID: 2
func_code: 4
address: 0
length: 12
recv_DB: rdata_SC
recv_start: 32 # 要注意开始地址不一样
- comment: 第3个poll 指定发送数据
mode: custom # 指定为自定义模式,由用户控制发送
is_modbus: true # 指定为modbus协议,有 send_data 参数时默认为非modbus协议
send_data: 03 03 00 00 00 0C 00 00 # send_data 必须是一个由空格分隔的16进制字节的字符串
recv_DB: rdata_SC
recv_start: 64 # 要注意开始地址不一样
extra_code: |- # 通过设置 request 来控制发送
"SC_polls_DB".CP01[2].request := "Clock_1Hz";
- comment: 第4个poll 读取线圈
unit_ID: 4
func_code: 1
address: 0
length: 8
recv_DB: EDO02
recv_start: 0
- comment: 第5个poll 指定外部发送块
mode: custom
send_DB: EDO02
send_start: 20
recv_DB: EDO02
recv_start: 8 # 要注意开始地址不一样
extra_code: |- # 通过设置 custom_trigger 来控制发送
"write_SC"."EDO02"(writing := "SC_polls_DB".CP01[4].custom_trigger);
...