之前在文章《JavaScript如何对欧姆龙、三菱、施耐德等PLC进行读写通讯控制》有介绍,如何通过 LECPServer + Javascript 对欧姆龙,三菱,施耐德等PLC进行通讯控制。
在实际使用中,发现LECPServer与西门子的PLC进行通讯有一定的区别。
首先说明下,LECPServer支持西门子大部分的PLC型号,以下是支持的类型列表:
- S1200
- S1500
- S200
- S200Smart
- S400
西门子的PLC均以以太网形式与LECPServer进行链路通讯。
我们按照之前《JavaScript如何对欧姆龙、三菱、施耐德等PLC进行读写通讯控制》文章内提到的,配置PLC_DRIVER类型为西门子系列,IP设置为西门子的PLC设置的IP地址。
当我们设置点位数据类型为浮点型的时候(则PLC设置为Real,LECPServer设置为Float),发现PLC和LECPServer的数值并不一致。
如图,PLC端为3.14,而LECPServer则显示为197391.8 。
后来经过查询西门子PLC的资料,明确这个问题的原因是因为西门子的PLC的位结构为DCBA,而LECPServer 1.0.18之前的版本,默认设置为CDAB,具体的DATAFORMAT含义可以参考JLean的说明文档。
data format 枚举说明 传送门 http://www.jlean.org:3000/#/interface/plc/data-format
当我们选择DATAFORMAT为DCBA后,点击应用,则可以看到正确的浮点数据。
接下来,我们直接用js代码来访问LECPServer对PLC进行读写了。代码如下:
let url = "http://127.0.0.1:8088";
$.ajax({
url: url,
// 读取PLC节点数据
data: JSON.stringify({
"action":"plc_read_node",
"node":"NODES.SIE.M100"
}),
contentType: "application/x-www-form-urlencoded",
type: 'POST',
timeout: 2000,
success: function (response) {
// 解析节点数据
// 数据长度是1,因此拿v[0]的数据即可
v = JSON.parse(response);
console.log(v);
},
error: function (x, t, m) {
console.log(x);
}
});