新闻中心
PRESS CENTER为提升用户操作便捷性,网关已实现对不同PLC协议差异性的底层封装,用户无需关注协议差异。不同的PLC品牌,不同的PLC节点,使用方式已完全统一,均可参考本使用文档。
新版本PLC节点将输出端口优化为2个独立接口,实现读写响应的物理隔离:
输出口1:专用于数据读取响应
输出口2:专用于数据写入响应
本优化属于增量升级,完全兼容历史版本,主要目标是进一步降低用户使用门槛。请注意当前使用手册可能尚未同步更新相关内容,具体操作请以实际设备功能为准。
PLC 物理连接分为 网口连接、串口连接。两种连接方式的参数配置分别如下。部分参数需要向PLC工程师或者业主方获取:
【网络参数】
地址:PLC的IP地址。
端口:PLC的端口号。
连接超时:连接超时时间,超时后重连。
通讯超时:等待PLC响应的时间,如果是负数则不等待。
【串口参数】
串口:串口号。
波特率:600~115200。
数据位:8 | 7
停止位:1 | 2
校验位:NONE(无) | ODD(奇) | EVEN(偶)
读取超时:读数据的等待时间,'-1'表示永不超时
写入超时:写数据的等待时间,'-1'表示永不超时
等待时间:接收对方返回数据的等待时间,'0'表示不等待
PLC正确连接后,需要配置点位表。点位表由若干行组成,每一行代表一个数据点。行的各个参数介绍如下:
选中
请勾选要读取的点位。不勾选则不会自动读取,仅用于写入时匹配数据点用。
写入匹配示例:输入格式【msg.payload.C = 125】,当点位表中存在数据名称为C或者地址为C的点位时,将会匹配该点位,并将值125写入该点位。否则不作处理。
组
连续 且 可读 且 数据类型相同 的点位可配置为一个组。此目的是为了让读取效率最大化,一个组的数据可以使用1条命令交互完成读写。1条命令最大可读5000点位。如果对读取效率无要求,可以不设置 组 。
如果不了解点位是否连续 、可读、数据类型,请参考【常规 读】。
地址
PLC内数据点的地址。
当点位的内容为字符串时,需指定【点位长度】。点位地址与要读取的长度以'-'分隔。例如:【V2-30】表示从点位地址V2开始读取30个字符。
名称
PLC内数据点的名称。
读取后以【msg.payload.名称】输出 ,如果为空则按【msg.payload.地址】输出 。
类型
按选择的数据类型解析数据。
对于字符串,请先确认该点位的编码格式。
String-ACSII:ACSII 。
不支持中文。
String-Unicode:Unicode。
按小端对字节解码。
String-Unicode-big:Unicode。
按大端对字节解码。
String-UTF-8:UTF-8。
String-UTF-32:UTF-32。
String-ANSI:ANSI。
String-GB2312:GB2312。
循环读取
设置后,后台会自动按照设置的时间周期循环读取PLC的数据,单位 ms。
点位属性不明确的情况下 ( 是否连续? 是否可读? 数据类型是否相同?) ,建议使用此方法。
步骤一: 配置连接
根据PLC的协议、连接方式选择合适的配置参数。
步骤二: 添加点位
在节点的配置页面依次添加要读写的点位。
不需要设置<组>。
勾选要读取的点位。
注意: 当点位较多时,可以先导出点位表,在表格工具中编辑后再导入。
步骤三:设置循环读取
若有需要,可配置循环读取,否则跳过此步骤。
测试:使用<调试节点>查看输出
添加调试节点到流程中,查看输出。注意:使用外部触发读取时,请将循环读取设置为-1。
输出说明
循环读取、外部触发读取、外部触发写入的输出对象略有不同。
使用注入节点读取实际上是让节点立即按照点位表读取一次数据,与循环读取的区别仅在于读取时间的区别。注入节点仅是为了调试方便。不满足写入格式的任意输入都能使节点立即按照点位表读取一次数据。
{
"payload":{
"名称测试":false,
"DB1.0.2":false
},
"rspType":"intRead",
"_msgid":"9b83c4384131d66f"
}
/*payload : 循环读取的值*/
/* 名称测试 : 名称为 '名称测试'的点位,当前值读取的值为false */
/* DB1.0.2 : 地址为 'DB1.0.2'的点位,当前值读取的值为false */
/*rspType : 当前输出的类型 */
/*intRead : 循环读取输出 */
/*inputRead : 外部触发读取输出 */
/*inputWrite: 外部触发写入输出 */
/*_msgid : 当前消息id*/
进阶读,实际上就是按组读,即:使读写效率最大化。使用进阶读,请先理解点位表属性< 组 >概念 。
步骤一:配置连接
根据PLC的协议、连接方式选择合适的配置参数。
步骤二:按组配置点位
在节点的配置页面中添加点位。
< 没有分组(空字符串) >
但
< 被勾选 >
的点位会被
单独读取
。
< 没有分组(空字符串) >
且
< 没被勾选 >
的点位只在
写入时用作匹配点位
。
注意: 当点位较多时,可以先导出点位表,在表格工具中编辑后再导入。
步骤三:设置循环读取
若有需要,可配置循环读取,否则跳过此步骤。
测试:使用<调试节点>查看输出
输出说明
循环读取、外部触发读取、外部触发写入 的输出对象 略有不同。
使用注入节点读取实际上是让节点立即按照点位表读取一次数据,与循环读取的区别仅在于读取时间的区别。注入节点仅是为了调试方便。不满足写入格式的任意输入都能使节点立即按照点位表读取一次数据。
{
"payload":{
"DB1.0.1":false,
"DB1.0.2":false,
"DB1.0.3":false,
"DB1.0.4":true,
"DB1.0.6":false,
"DB1.0.11":false,
"DB1.0.12":false,
"DB1.0.13":false,
"M1.6":false,
"V2":"aa中文编码测试\u0000\u0000\u0000\u0000\u0000\u0000"
},
"rspType":"intRead",
"_msgid":"d4ef195506deab88"
}
/*payload : 循环读取的值*/
/* DB1.0.1 : 地址为 "DB1.0.1'的点位,当前值读取的值为false */
/* ...*/
/* V2 : 地址为"V2'的点位,当前值读取的值为 aa中文编码测试\u0000\u0000\u0000\u0000\u0000\u0000 */
/*rspType : 当前输出的类型 */
/*intRead : 循环读取输出 */
/*inputRead : 外部触发读取输出 */
/*inputWrite: 外部触发写入输出 */
/*_msgid : 当前消息id*/
借助点位表的配置可快速写入参数,这里以一个流程示例:
PLC点位表配置如下:
输入
输入内容通过函数节点实现,格式如下:
msg.payload = {
B:true,
A:false
}
/*payload : 要写入的参数*/
/* B : 名称为 "B'的点位,要写入的值为 true */
/* A : 名称为 "A'的点位,要写入的值为 false*/
/* 传入地址:DB1.0.1亦可被识别*/
输出
按照输入示例的规范输入后,PLC节点会将数据写入PLC,并打印结果:
{
"payload":{
"A":true,
"B":true
},
"rspType":"inputWrite",
"inputMsg":{
"_msgid":"e1816c45abd5e4a3",
"payload":{
"B":true,
"A":false
},"topic":""
},
"_msgid":"20a8b1995cd507cd"
}
/*payload : 写入的结果*/
/* A : 名称为 "A'的点位,true:操作成功false:操作失败*/
/* B : 名称为 "B'的点位,true:操作成功false:操作失败*/
/* 返回的顺序取决与点位在点位表的排序 */
/*rspType : 当前输出的类型 */
/*intRead : 循环读取输出 */
/*inputRead : 外部触发读取输出 */
/*inputWrite: 外部触发写入输出 */
/*inputMsg : 触发本次操作的消息对象 参考 <常规 写> --->输入 */
/*_msgid : 当前消息id*/
通过向PLC节点注入一个对象,可以实现更高效、更自由的读写。此方法完全由用户自己掌控读写操作,PLC节点内部的点位配置无效。
使用高级读写时可忽略点位表。
func | Notes | example |
ReadAddressArray | 一次性获取多个地址的数据,length以字节为单位,type为对应数据类型(此方法只能西门子使用) | { func: "ReadAddressArray", body: { name: ["a", "b", "c"], datatype: ["byte", "int16"], address: ["VB10", "VD102"], length: [6, 6]} } |
ReadByteArray | 读连续地址的字节数据 | { func: "ReadByteArray", body: { name: "abc", address: "VB10", length: 6 } } |
WriteByteArray | 向连续地址写入字节数据 | { func: "WriteByteArray", body:{ name: "", address: "VB10", value: "00 1A 2B 3C 4D 5E" } } |
ReadBool | 读取单个地址的布尔数据 | { func: "ReadBool", body: { name: "", address: "V0.0" } } |
ReadBoolArray | 读取连续地址的布尔数据 | { func: "ReadBoolArray", body: { name: "", address: "V0.1", length: 6 } } |
WriteBool | 向单个地址写入布尔数据 | { func: "WriteBool", body: { name: "", address: "V0.0", value: true } } |
WriteBoolArray | 向连续地址写入布尔数据 | { func: "WriteBoolArray", body: { name: "", address: "V0.1", values: [true, false, true, false, true, false] } } |
ReadInt16 | 读取单个地址的16位有符号整数 | { func: "ReadInt16", body: { name: "", address: "VD100" } } |
ReadInt16Array | 读取连续地址的16位有符号整数 | { func: "ReadInt16Array", body: { name: "", address: "VD102", length: 6 } } |
WriteInt16 | 向单个地址写入16位有符号整数 | { func: "WriteInt16", body: { name: "", address: "VD100", value: 123 } } |
WriteInt16Array | 向连续地址写入16位有符号整数 | { func: "WriteInt16Array", body: { name: "", address: "VD102", values: [1, 2, 3, 4, 5, 6] } } |
ReadUInt16 | 读取单个地址的16位无符号整数 | { func: "ReadUInt16", body: { name: "", address: "VD110" } } |
ReadUInt16Array | 读取连续地址的16位无符号整数 | { func: "ReadUInt16Array", body: { name: "", address: "VD112", length: 6 } } |
WriteUInt16 | 向单个地址写入16位无符号整数 | { func: "WriteUInt16", body: { name: "", address: "VD110", value: 456 } } |
WriteUInt16Array | 向连续地址写入16位无符号整数 | { func: "WriteUInt16Array", body: { name: "", address: "VD112", values: [0, 1, 2, 3, 4, 5] } } |
ReadInt32 | 读取单个地址的32位有符号整数 | { func: "ReadInt32", body: { name: "", address: "VD120" } } |
ReadInt32Array | 读取连续地址的32位有符号整数 | { func: "ReadInt32Array", body: { name: "", address: "VD124", length: 6 } } |
WriteInt32 | 向单个地址写入32位有符号整数 | { func: "WriteInt32", body: { name: "", address: "VD120", value: 456 } } |
WriteInt32Array | 向连续地址写入32位有符号整数 | { func: "WriteInt32Array", body: { name: "", address: "VD124", values: [6, 7, 8, 9, 10, 11] } } |
ReadUInt32 | 读取单个地址的32位无符号整数 | { func: "ReadUInt32", body: { name: "", address: "VD130" } } |
ReadUInt32Array | 读取连续地址的32位无符号整数 | { func: "ReadUInt32Array", body: { name: "", address: "VD131", length: 6 } } |
WriteUInt32 | 向单个地址写入32位无符号整数 | { func: "WriteUInt32", body: { name: "", address: "VD130", value: 290 } } |
WriteUInt32Array | 向连续地址写入32位无符号整数 | { func: "WriteUInt32Array", body: { name: "", address: "VD131", values: [12, 13, 14, 15, 16, 17] } } |
ReadInt64 | 读取单个地址的64位有符号整数 | { func: "ReadInt64", body: { name: "", address: "VD140" } } |
ReadInt64Array | 读取连续多个地址的64位有符号整数 | { func: "ReadInt64Array", body: { name: "", address: "VD141", length: 6 } } |
WriteInt64 | 向单个地址写入64位有符号整数 | { func: "WriteInt64", body: { name: "", address: "VD140", value: 310 } } |
WriteInt64Array | 向连续地址写入64位有符号整数 | { func: "WriteInt64Array", body: { name: "", address: "VD141", values: [20, 21, 22, 23, 24, 25] } } |
ReadUInt64 | 读取单个地址的64位无符号整数 | { func: "ReadUInt64", body: { name: "", address: "VD150" } } |
ReadUInt64Array | 读取连续地址的64位无符号整数 | { func: "ReadUInt64Array", body: { name: "", address: "VD151", length: 6 } } |
WriteUInt64 | 向单个地址写入64位无符号整数 | { func: "WriteUInt64", body: { name: "", address: "VD150", value: 330 } } |
WriteUInt64Array | 向连续地址写入64位无符号整数 | { func: "WriteUInt64Array", body: { name: "", address: "VD151", values: [20, 21, 22, 23, 24, 25] } } |
ReadFloat | 读取单个地址的单精度浮点数 | { func: "ReadFloat", body: { name: "", address: "VD160" } } |
ReadFloatArray | 读取连续地址的单精度浮点数 | { func: "ReadFloatArray", body: { name: "", address: "VD160", length: 6 } } |
WriteFloat | 向单个地址写入单精度浮点数 | { func: "WriteFloat", body: { name: "", address: "VD160", value: 1.1 } } |
WriteFloatArray | 向连续地址写入单精度浮点数 | { func: "WriteFloatArray", body: { name: "", address: "VD160", values: [1.1, 2.2, 3.3, 4.4, 5.5, 6.6] } } |
ReadDouble | 读取单个地址的双精度浮点数 | { func: "ReadDouble", body: { name: "", address: "VD180" } } |
ReadDoubleArray | 读取连续地址的双精度浮点数 | { func: "ReadDoubleArray", body: { name: "", address: "VD200", length: 6 } } |
WriteDouble | 向单个地址写入双精度浮点数 | { func: "WriteDouble", body: { name: "", address: "VD180", value: 12.3 } } |
WriteDoubleArray | 向连续地址写入 双精度浮点数 | { func: "WriteDoubleArray", body: { name: "", address: "VD200", values: [7.1, 8.2, 9.3, 10.4, 11.5, 12.6] } } |
ReadString | 读取字符串 | { func: "ReadString", body: { name: "", address: "VD301", length: 11 } } |
WriteString | 写入字符串 | { func: "WriteString", body: { name: "", address: "VD300", value: "hello world" } } |
读单个点位
一次读一个点位,示例如下:
输入对象结构如下:
msg.payload =
{
"func": "ReadBool",
"body": {
"address": "DB1.0.4",
"name":"test"
}
}
/*func : 控制字段 */
/* ReadBool*/
/* ReadByte*/
/* ReadInt16 */
/* ReadUInt16*/
/* ReadInt32 */
/* ReadUInt32*/
/* ReadInt64 */
/* ReadUInt64*/
/* ReadFloat */
/* ReadDouble*/
/*body : 一个对象,包含要读取的点位、点位名称 */
/*address:点位地址 */
/*name :点位名称 -可选,如果携带了此字段且不为空,则以此字段作为 key,否则以点位地址为 key */
输出对象结构如下:
{
"payload":{
"test":true
},
"rspType":"inputRead",
"inputMsg":{
"_msgid":"06f6cb5ef65e7df2",
"payload":{
"func":"ReadBool",
"body":{
"address":"DB1.0.4",
"name":"test"
}
},
"topic":""
},
"_msgid":"6c0dc0e5b35c7212"
}
/*payload : 外部触发读取的值*/
/* test : 名称为 'test'的点位,当前值读取的值为true*/
/*rspType : 当前输出的类型*/
/*intRead : 循环读取输出*/
/*inputRead : 外部触发读取输出*/
/*inputWrite: 外部触发写入输出*/
/*inputMsg : 输入的对象请参考 参考 < 高级 读 写 > --> < 读 > --> < 读单个 >输入*/
/*_msgid : 当前消息id*/
读多个点位(同类型)
一次读多个同类型点位,示例如下:
输入对象结构如下:
msg.payload =
{
"func": "ReadBoolArray",
"body": {
"address": "DB1.0.1",
"name": 'test',
"length": 10
}
}
/*func : 控制字段*/
/* ReadBoolArray*/
/* ReadByteArray*/
/* ReadInt16Array */
/* ReadUInt16Array*/
/* ReadInt32Array */
/* ReadUInt32Array*/
/* ReadInt64Array */
/* ReadUInt64Array*/
/* ReadFloatArray */
/* ReadDoubleArray*/
/*body : 一个对象,包含要读取的点位、点位名称 */
/*address:点位地址 */
/*name :点位名称 -可选,如果携带了此字段且不为空,则以此字段作为 key,否则以点位地址为 key */
/*length :点位数量 */
输出对象结构如下:
{
"payload":{
"test":[false,true,false,true,false,false,false,false,false,false]
},
"rspType":"inputRead",
"inputMsg":{
"_msgid":"2a6fc9bdb035b576",
"payload":{
"func":"ReadBoolArray",
"body":{
"address":"DB1.0.1",
"name":"test",
"length":10
}
},
"topic":""
},
"_msgid":"d5cd648295d54b9e"
}
/*payload : 外部触发读取的值*/
/* test : 名称为 'test'的点位(起始点位),
当前值读取的值为[false,true,false,true,false,false,false,false,false,false]
类型为 Array */
/*rspType : 当前输出的类型*/
/*intRead : 循环读取输出*/
/*inputRead : 外部触发读取输出*/
/*inputWrite: 外部触发写入输出*/
/*inputMsg : 输入的对象请参考 参考 < 高级 读 写 > -->< 读 > --> < 读多个 >输入*/
/*_msgid : 当前消息id*/
读多个点位(不同类型)
对于类型不同的点位可以使用数组的形式输入,合并一起读取。
对于类型不同的点位可以使用数组的形式输入,合并一起读取。
输入对象结构如下:
msg.payload =
[{
"func": "ReadInt16",
"body": {
"address": "DB1.0"
}
}, {
"func": "ReadInt16Array",
"body": {
"address": "DB2.0",
"length": 5
}
}, {
"func": "ReadBoolArray",
"body": {
"address": "DB3.0",
"length": 9
}
}]
/*数组的成员 即 <读单个>、<读多个>的输入*/
输出对象结构如下:
{
"payload":{
"DB1.0":5120,
"DB2.0":[0,0,0,0,0],
"DB3.0":[false,false,false,false,false,false,false,false,false]
},
"rspType":"inputRead",
"inputMsg":{
"_msgid":"63860e372f904617",
"payload":[
{"func":"ReadInt16","body":{"address":"DB1.0"}},
{"func":"ReadInt16Array","body":{"address":"DB2.0","length":5}},
{"func":"ReadBoolArray","body":{"address":"DB3.0","length":9}}
],
"topic":"",
"test":"aaaa"
},
"_msgid":"10b9ad097069625b"
}
/*payload : 外部触发读取的值*/
/* DB1.0 : 地址为 'DB1.0'的点位,值 5120 */
/*...*/
/*rspType : 当前输出的类型*/
/*intRead : 循环读取输出*/
/*inputRead : 外部触发读取输出*/
/*inputWrite: 外部触发写入输出*/
/*inputMsg : 输入的对象请参考 参考 < 高级 读 写 > -->< 读 > --> < 合并读取 >输入*/
/*_msgid : 当前消息id*/
西门子S7协议读多个
特别指出:西门子S7协议支持按地址读取数据。
输入对象结构如下:
msg.payload =
{
"func": "ReadAddressArray",
"body": {
"address": ["DB1.0", "DB1.1", "DB1.2", "V0", "V2", "V2"],
"name":"",
"type": ["Bool", "Bool", "Bool", "UInt16", "UInt32", "String-Unicode-big"],
"length": [1, 1, 1, 4, 4, 80]
}
}
/*func : 控制字段 */
/* ReadAddressArray 【唯一】/*
/*body : 一个对象,包含要读取的点位、点位名称 */
/*address:点位地址 */
/*name :点位名称 -可选,如果携带了此字段且不为空,则以此字段作为 key,否则以点位地址为 key */
/*type :点位类型参考 <属性> --> <类型> */
输出对象结构如下:
{
"payload":{
"DB1.0":[false,false,true,false,true,false,false,false],
"DB1.1":[false,false,false,false,false,false,false,false],
"DB1.2":[false,true,true,true,true,true,true,true],
"V0":[5120,65040],
"V2":"aa中文编码测试\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000"
},
"rspType":"inputRead",
"inputMsg":{
"_msgid":"491920338e36c07e",
"payload":{
"func":"ReadAddressArray",
"body":{
"address":["DB1.0","DB1.1","DB1.2","V0","V2","V2"],
"name":"",
"type":["Bool","Bool","Bool","UInt16","UInt32","String-Unicode-big"],
"length":[1,1,1,4,4,80]
}
},
"topic":""
},
"_msgid":"a653aa1949ecd101"
}
/*payload : 外部触发读取的值*/
/* DB1.0 : 地址 'DB1.0'的点位(起始点位),
当前值读取的值为[false,false,true,false,true,false,false,false] 类型为 Array*/
/*...*/
/*V2 : 地址 'V2'的点位(起始点位)
当前值读取的值为 aa中文编码测试\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000\u0000
类型为 String*/
/*rspType : 当前输出的类型*/
/*intRead : 循环读取输出*/
/*inputRead : 外部触发读取输出*/
/*inputWrite: 外部触发写入输出*/
/*inputMsg : 输入的对象请参考 参考 < 高级 读 写 > --> < S7 读 > --> 输入*/
/*_msgid : 当前消息id*/
注意
如果使用高级读写读取字符串 ,可以先按字节读取指定的长度,然后解析返回的数据。
写单个
一次写一个点位,示例如下:
输入对象结构如下:
msg.payload =
{
"func": "WriteBool",
"body": {
"address": "DB1.0.4",
"name":"test",
"value":true
}
}
/*func : 控制字段*/
/* WriteBool*/
/* WriteByte*/
/* WriteInt16 */
/* WriteUInt16*/
/* WriteInt32 */
/* WriteUInt32*/
/* WriteInt64*/
/* WriteUInt64*/
/* WriteFloat */
/* WriteDouble*/
/* WriteString*/
/*body : 一个对象,包含要写入的点位、点位值 */
/*address:点位地址 */
/*name :点位名称 -可选,如果携带了此字段且不为空,则以此字段作为 key,否则以点位地址为 key */
/*value:要写入的值 */
输出对象结构如下:
{
"payload":{
"test":true
},
"rspType":"inputWrite",
"inputMsg":{
"_msgid":"a20bc807b2876c74",
"payload":{
"func":"WriteBool",
"body":{
"address":"DB1.0.4",
"name":"test",
"value":true
}
},
"topic":""
},
"_msgid":"8031517037c06b21"
}
/*payload : 外部触发 写入 执行的结果*/
/*test : 名为 'test'的点位,执行结果true:成功false:失败 */
/*rspType : 当前输出的类型*/
/*intRead : 循环读取输出*/
/*inputRead : 外部触发读取输出*/
/*inputWrite: 外部触发写入输出*/
/*inputMsg : 输入的对象请参考 参考 < 高级 读 写 > --> < 写 >--><写单个> --> 输入*/
/*_msgid : 当前消息id*/
注意:西门子Smart200 WriteString一次写入有长度限制。建议借助点位表实现超长数据写入。
写多个
一次写多个点位,示例如下:
输入对象结构如下:
msg.payload=
{
"func": "WriteBoolArray",
"body": {
"address": "DB1.0.1",
"name":"test",
"values":[true,false,true,false]
}
}
/*func : 控制字段*/
/* WriteBoolArray*/
/* WriteInt16Array */
/* WriteUInt16Array*/
/* ReadInt32Array */
/* WriteUInt32Array*/
/* WriteInt64Array*/
/* WriteUInt64Array*/
/* WriteFloatArray */
/* WriteDoubleArray*/
/*body : 一个对象,包含要写入的点位、点位值 */
/*address:点位地址 */
/*name :点位名称 -可选,如果携带了此字段且不为空,则以此字段作为 key,否则以点位地址为 key */
/*values:要写入的值 [Array] */
输出对象结构如下:
{
"payload":{
"a":true,
"b":true
},
"rspType":"inputWrite",
"inputMsg":{
"_msgid":"f108c441d997cd9f",
"payload":[{
"func":"WriteBoolArray",
"body":{
"name":"a",
"address":"V0.0",
"values":[true,false,true,false,true,false]}
},{
"func":"WriteBoolArray",
"body":{
"name":"b",
"address":"V100.0",
"values":[true,false,true,false,true,false]}
}],
"topic":"",
"_event":"node:0c5265872911e459"
},
"_msgid":"2581ee60d30a5273"
}
/*payload : 外部触发 写入 执行的结果*/
/*a : 名为 'a'的点位,执行结果true:成功false:失败 */
/*rspType : 当前输出的类型*/
/*intRead : 循环读取输出*/
/*inputRead : 外部触发读取输出*/
/*inputWrite: 外部触发写入输出*/
/*inputMsg : 输入的对象请参考 参考 < 高级 读 写 > --> < 写 >--><写多个> --> 输入*/
/*_msgid : 当前消息id*/
按字节写多个
注意,按字节写多个时,需要将要写入的值转为16进制字符串形式。
输入对象结构如下:
msg.payload = [{
func: "WriteByteArray",
body: {
name: "a",
address: "V0",
value: "00 1A 2B 3C 4D 5E"}
},{
func: "WriteByteArray",
body: {
name: "b",
address:"V100",
value:"00 1A 2B 3C 4D 5E"
}
}]
/*func : 控制字段*/
/* WriteByteArray*/
/*body : 一个对象,包含要写入的点位、点位值 */
/*address:点位地址 */
/*name :点位名称 -可选,如果携带了此字段且不为空,则以此字段作为 key,否则以点位地址为 key */
/*value:要写入的值 */
输出对象结构如下:
{
"payload": {
"a": true,
"b": true
},
"rspType": "inputWrite",
"inputMsg": {
"_msgid": "8af239f0a126347f",
"payload": [{
"func": "WriteByteArray",
"body": {
"name": "a",
"address": "V0",
"value": "00 1A 2B 3C 4D 5E"
}
}, {
"func": "WriteByteArray",
"body": {
"name": "b",
"address": "V100",
"value": "00 1A 2B 3C 4D 5E"
}
}],
"topic": "",
"_event": "node:48035aaef43d7e72"
},
"_msgid": "e37370ddcf37073d"
}
/*payload : 外部触发 写入 执行的结果*/
/*a : 名为 'a'的点位,执行结果true:成功false:失败 */
/*rspType : 当前输出的类型*/
/*intRead : 循环读取输出*/
/*inputRead : 外部触发读取输出*/
/*inputWrite: 外部触发写入输出*/
/*inputMsg : 输入的对象请参考 参考 < 高级 读 写 > --> < 写 >--><按字节写读个> --> 输入*/
/*_msgid : 当前消息id*/
源码/详细:https://iotrouter.yuque.com/zn3vdn/eg8000/vw4fa0mibhixgocn#J2HzK