通道服务名:s7plc-client
工程名称:fox-edge-server-channel-s7plc-client
说明:s7plc-client通道服务器,西门子S7协议的PLC。
在现实项目中,西门子的PLC一直在PLC行业中占有主要影响力,它的S7系列的PLC。
S7是一个多层的协议栈,并不是一个简单的通讯协议。
针对这个业务场景,灵狐开发了s7plc-client这种通道服务,来支持该场景。
进一步考虑到用户的现场设备可能有很多种类型,所以s7plc-client支持同时开启多服务端口,各自接收一种设备类型的数据。
该服务的操作方法,只有单工的publish和report两种模式,没有主从半双工的execute模式。
这样设计的目的,是因为execute只适合一问一答式的传统自动化设备。
但是,对于很多会采用udp的设备来说,它们的设计更多的是采用全双工的方式。
换句话说,在传输层面,上行和下行是彼此独立的,上行和下行,可以认为是两条各自独立的单向通道。
所以,s7plc-client的操作方法,也跟着用publish和report来分别对应上行和下行数据的传输。
线下设备主动向s7plc-client的适合,会通过报文告知上层应用,自己的身份特征信息。
如何从报文中获得身份特征信息,同样需要解码器从中提取。
中科图灵的安防设备,它的通信报文格式为
报头:4 字符, ‘2’ ’4’ ’2’ ’4’;
通信类型:1 字符
设备类型:1 字符
长度:2 字符
IMEI,15 字符
ICCID,20 字符
数据区:N字符
包尾:2 字符,’A’’ A’
报文范例:
2424 08 43 867572058700527 89861121245014174191 0058009b00b3006400b6019e110200 aa
867572058700527是它的IMEI,89861121245014174191是它的ICCID,这两个标识信息合并成一个字符串"867572058700527:89861121245014174191",
就可以辨别出下面一堆同型号的现场设备是具体哪个设备。
s7plc-client提供了自动识别的接口:cn.foxtech.device.protocol.v1.utils.netty.ServiceKeyHandler
开发者应该写一个解码器,并派生一个子类,为s7plc-client指出身份特征特征,那么s7plc-client在接收到数据报文之后,
会使用ServiceKeyHandler的派生类自动进行身份的自动提取,然后自动维护某个设备的IP:PORT地址和业务通道的关联关系。
设备主动向s7plc-client发送报文之后,s7plc-client这时候才知道设备所在的IP:PORT地址。
如果设备未主动上报身份报文,那么,Fox-Edge是无法透过s7plc-client给设备发送报文的,因为你都不知道设备在哪里。
另外,设备长时间未发送报文,这个IP:PORT可能被电信运营商回收,这时候设备又“消失”了,你无法给它发送信息。
UDP只有在局域网之中,你才可用跟设备比较稳定的通信,这就是UDP在公网的问题。公网要进行稳定的双向通信的话,还是用TCP吧。
用户在通道界面创建一个s7plc-client类型的通道之后,在通道上配置好身份特征特征,那么Fox-Edge就会遵循下列操作流程
【现场设备】《==UDP==》【通道服务】(tcp连接-身份特征-通道名)《==Channel==》【设备服务】
这样,上层应用就能够以channel的方式,进行跟远程的现场设备,基于UDP的方式进行交互操作了。
为channel-tcp-server创建一个serverConfig的配置
jarFile:解码器所在的文件位置
splitHandler:拆包类的完整名称
keyHandler:提取设备身份信息的完整名称
{
"decoderList": [{
"decoder": [{
"jarFile": "\\jar\\decoder\\fox-edge-server-protocol-zktl-air6in1-1.0.2.jar"
}],
"keyHandler": "cn.foxtech.device.protocol.v1.zktl.air6in1.handler.ZktlServiceKeyHandler",
"serverPort": 9301,
"lifeCycle": 3600
}, {
"decoder": [{
"jarFile": "\\jar\\decoder\\fox-edge-server-protocol-zktl-air5in1-1.0.2.jar"
}],
"keyHandler": "cn.foxtech.device.protocol.v1.zktl.air5in1.handler.ZktlServiceKeyHandler",
"serverPort": 9302,
"lifeCycle": 3600
}]
}