s7-scl-gen
Version:
S7 PLC SCL 代码自动生成
154 lines (128 loc) • 6.66 kB
YAML
# 指示属于哪一个CPU和哪一种功能
# 下例指示CPU名字为AS1,功能为SC(串行通信 serial commnucation)
# SC 也可以写为 MB、modbusRTU
name: AS1-SC
description: |
使用 CP340 通信,必须在step7工程中加入以下库
* FB2 P_RCV
* FB3 P_SEND
使用 CP341 通信,必须在step7工程中加入以下库
* FB7 P_RCV_RK
* FB8 P_SND_RK
includes:
# 可通过指定includes,系统自动添加对应代码进 CP_Loop.scl 中。
# 如果发送接收块的FB背景块,建议将该FB的定义文件放入includes中
- A101.SCL # 该文件包含 A101L FB 的实现
- FXGasFlow.scl
symbols:
# 系统已有5个内置符号:
# - [CP340_Poll, FB340] CP340通信主处理函数
# - [CP341_Poll, FB341] CP341通信主处理函数
# - [CRC16, FC464, CRC16, modbus CRC16 check] CRC16校验函数
# - [SC_Loop, FC341] 表示主循环调用FC,将这个加入OB1中
# - [SC_polls_DB, DB880] 将用于保存轮询命令数据
# 可以在对上述内置符号的地址进行更改,只要重新定义就可以了,注意保持名称一致
# 以下为自定义符号,这里是接收块
# 建议所有的接收块都用FB定义结构,不仅减少接收块的定义工作量,还能在FB中方便地对接收后的数据进一步处理和转换。
# 如果发送数据需要动态更改,则建议发送和接收都用同一个FB背景块方便处理。
# 转换程序能对发送块接收块是FB背景块的情况自动生成FB调用代码,注意接收FB不要有参数!
# 这类FB不通用,需要另外单独写SCL代码。
- [A101L, FB802]
- [FXGasFlow, FB803, ~, 福鑫天然气流量接收块]
- [FXGasWrite, FB811, ~, 写气表参数处理块]
- [Flow30, DB830, JS_flow]
- [GAS, DB841, FXGasFlow]
- [cmd_ret, DB+, FXGasWrite]
# JS_Flow 已在 CPU 文档中定义
list : # CP 模块列表
# 可以在一个模块中混用 modbus 和原始串行通信
# modbus协议暂只支持 01 02 03 04 05 06 号功能码
# 列表第一层为模块配置
# 模块和下一层为poll配置
# 在poll配置项中,通常不需要指定 send_DB
# 转换程序会自动把配置里的发送数据放在SC_polls_DB中
# 否则指定 send_DB 后,配置里的发送数据将无效,由指定的send_DB send_start send_length 决定发送内容
# recv_DB recv_start 必须指定CPU中的地址,不会自动生成。
- comment: CP01 Module736 储罐液位
# 值: 字符串 指定CP通信硬件类型,默认CP341
model: CP340
# 值: 字符串 省略时默认为 polls_<module_address>
name: polls_LIT
# 值: WORD
# 类型: S7符号定义 | S7符号引用
# module 和 module_addr 必须填写一个,用于指明使用哪一个CP模块硬件
module: [CP01, IW736]
#module_addr: 736
# 值: DB
# 类型: S7符号定义 | S7符号引用
DB: [CP_01, DB881]
# 值: BOOL
# 类型: S7符号定义 | S7符号引用 | SCL表达式
# 指示由外部触发通信,省略时将自动使用顺序发送
customREQ: Clock_1Hz
polls:
- comment: '液位' # 值: 字符串
# 值: 字符串 必须是一个由空格分隔的16进制字节的字符串
# send_data 定义了通用485通信的发送数据,modbus数据见第二个CP模块的poll
send_data: 31 31 30 30 0D
# 值: DB
# 类型: S7符号定义 | S7符号引用
# 注意,同一个DB符号只允许定义一次
# 如另一poll要使用相同的DB块,要在另一poll中使用S7符号引用指向这里
recv_DB: [tankLitre, DB20, A101L]
# 值: 正整数
recv_start: 0
- comment: CP02 Module752 河口来油流量与天然气流量
name: polls_flow
# module 和 module_addr 必须填写一个,用于指明使用哪一个CP模块硬件
# 值: 正整数
#module: [CP02, IW752]
module_addr: 752
DB: [CP_02, DB882]
polls:
- comment: 河口1#流量计 30
# 没有 send_DB 和 send_data 配置项时, 由以下配置项定义 modbusRTU 发送数据
# unit_ID func_code address data|length 配置项为十进制整数
# 但如果采用字符串,则表示16进制,两种类型数字都是允许的。
# 运行时会自动处理CRC校验
# 配置项 length 和 data 本质是一样的,只是名称不同
# 但在生成的SCL中只有 data 这一字段
# 采用2个配置名称是为了功能码的读写语义,建议为了配置的可阅读性
# 01 02 03 04 功能用 length,05 06 功能用 data
unit_ID: 0x1e # 16进制数用字符串形式 等同于 30
func_code: 0x4 # 16进制数用字符串形式 等同于 4
address: 12 # 10进制数用整数形式 等同于 'c'
length: 0x1c # 16进制数用字符串形式 等同于 28
# 类型: S7符号定义 | S7符号引用
recv_DB: Flow30
recv_start: 0
- comment: 天然气3#流量计 # 非modbus发送,不要有unit_ID属性,直接在send_data属性上写16进制发送数据
# 可以通过设置 uninvoke 为 true,让转换程序不再自动调用FB,
# 这样方便自定义函数处理发送与接收数据,参见下方loop_end处
# 自定义函数可通过 SC_polls_DB.poll_{序号}_data.{数据符号} 来处理发送数据
# 比如本poll的发送数据SCL符号地址为:
# `"SC_polls_DB".polls_HK[2].sendLength` 发送长度
# `"SC_polls_DB".poll_2_data.send_data` (ARRAY OF BYTE)
# 如果 send_data 要动态变化,send_data要填充0满足最大长度
uninvoke: true # 取消自动调用,参看下方 loop_end 处的手动调用
send_data: 03 03 00 00 18 8E 5D # send_data 必须是一个由空格分隔的16进制字节的字符串
recv_DB: GAS # 接收块,引用GAS符号
recv_start: 20 # 要注意开始地址不一样
- comment: 天然气总表写参数 10#
# 正常情况下,无论是不是modbus,发送的数据都是固定的。
# 固定数据时,转换程序会自动为接收块为背景块的情形自动调用接收块处理FB
# 当发送数据不固定时,比如 modbus 05 命令,建议使用指定的FB背景块作为发送数据区
send_DB: cmd_ret
send_start: 10
send_length: 8
recv_DB: cmd_ret
recv_start: 0
# 用户自写SCL代码,放在循环的开始和结束处。
loop_begin: |-
// 这里的代码将在 AI_Loop 循环开始时执行
loop_end: |-
// 这里的代码将在 AI_Loop 循环结束时执行
// uninvoke poll 的处理代码应当放在这里
"FXGasFlow".GAS(has_received := M10.0);
...