Hi folks,
I am putting together a flow to read and write 32bit floats from/to a PLC using Modbus TCP.
To be honest it took mw way longer than it should have to get my head around the buffer manipulation nodes but I have them working now and can read and right floats... Which is nice!
However if I want to change the quantity of data read I have to alter the trigger for the flex_modbus node and also adjust the lengths for both the buffer nodes.
For context my read ...
my read gets 'some', lets say 6, words from the PLC, these are 'raw' values which I treat as uint16.
This data is used to create a buffer, 12 bytes long.
The buffer is then interpreted as a float32, which is how the PLC is interpreting the same data.
Writing out is a similar process that prepares an array of two uint16 for the flex_write node.
As I said both processes work but I would ideally like to create sub flow that wrap the process in much the same way as the flex-modbus nodes work.
I have tried copying the 'length' path and setting that with a change node but couldn't get it to work.
[
{
"id": "8f6909ec361ec4c9",
"type": "tab",
"label": "W/R int32 using Modbus",
"disabled": false,
"info": "",
"env": []
},
{
"id": "ac265d7f498243d9",
"type": "debug",
"z": "8f6909ec361ec4c9",
"name": "debug 20",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1140,
"y": 120,
"wires": []
},
{
"id": "08ac5471b622f9c9",
"type": "modbus-flex-getter",
"z": "8f6909ec361ec4c9",
"name": "",
"showStatusActivities": false,
"showErrors": false,
"showWarnings": true,
"logIOActivities": false,
"server": "0ca896640dce56e2",
"useIOFile": false,
"ioFile": "",
"useIOForPayload": false,
"emptyMsgOnFail": false,
"keepMsgProperties": false,
"delayOnStart": true,
"startDelayTime": "1",
"x": 570,
"y": 360,
"wires": [
[
"07802434ebcdba9f",
"cbe085c3e3b99e77"
],
[]
]
},
{
"id": "e6a52ab120b8f69b",
"type": "modbus-flex-write",
"z": "8f6909ec361ec4c9",
"name": "",
"showStatusActivities": false,
"showErrors": false,
"showWarnings": true,
"server": "0ca896640dce56e2",
"emptyMsgOnFail": false,
"keepMsgProperties": false,
"delayOnStart": false,
"startDelayTime": "",
"x": 970,
"y": 120,
"wires": [
[
"ac265d7f498243d9"
],
[]
]
},
{
"id": "85600f1e77533ef8",
"type": "change",
"z": "8f6909ec361ec4c9",
"name": "",
"rules": [
{
"t": "delete",
"p": "payload",
"pt": "msg"
},
{
"t": "set",
"p": "payload.unitid",
"pt": "msg",
"to": "255",
"tot": "num"
},
{
"t": "set",
"p": "payload.fc",
"pt": "msg",
"to": "modbus.wrd.fc_wn",
"tot": "global"
},
{
"t": "set",
"p": "payload.address",
"pt": "msg",
"to": "0",
"tot": "num"
},
{
"t": "set",
"p": "payload.quantity",
"pt": "msg",
"to": "2",
"tot": "num"
},
{
"t": "set",
"p": "payload.value",
"pt": "msg",
"to": "value",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 780,
"y": 120,
"wires": [
[
"e6a52ab120b8f69b"
]
],
"info": "{ value: msg.payload, \r\n'fc': 5, \r\n'unitid': 1, \r\n'address': 0 , \r\n'quantity': 1 }"
},
{
"id": "1280270bd9f81893",
"type": "inject",
"z": "8f6909ec361ec4c9",
"name": "",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "70000",
"payloadType": "num",
"x": 210,
"y": 120,
"wires": [
[
"6bdcda7432a3694b",
"9331c816dcb7049c"
]
]
},
{
"id": "d93a7a15489606cd",
"type": "inject",
"z": "8f6909ec361ec4c9",
"name": "",
"props": [
{
"p": "payload.connectorType",
"v": "TCP",
"vt": "str"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"x": 210,
"y": 360,
"wires": [
[
"fc887a65d6d4b2fb"
]
]
},
{
"id": "fc887a65d6d4b2fb",
"type": "change",
"z": "8f6909ec361ec4c9",
"name": "",
"rules": [
{
"t": "set",
"p": "payload.unitid",
"pt": "msg",
"to": "255",
"tot": "num"
},
{
"t": "set",
"p": "payload.fc",
"pt": "msg",
"to": "modbus.wrd.fc_rn",
"tot": "global"
},
{
"t": "set",
"p": "payload.address",
"pt": "msg",
"to": "0",
"tot": "num"
},
{
"t": "set",
"p": "payload.quantity",
"pt": "msg",
"to": "6",
"tot": "num"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 380,
"y": 360,
"wires": [
[
"08ac5471b622f9c9"
]
],
"info": "{ value: msg.payload, \r\n'fc': 5, \r\n'unitid': 1, \r\n'address': 0 , \r\n'quantity': 1 }"
},
{
"id": "5c2edcb1a6eb0eba",
"type": "buffer-parser",
"z": "8f6909ec361ec4c9",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "uint16be",
"name": "item2",
"offset": 2,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
},
{
"type": "uint16be",
"name": "item1",
"offset": 0,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "value",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": false,
"fanOutMultipleResult": false,
"setTopic": true,
"outputs": 1,
"x": 550,
"y": 120,
"wires": [
[
"149bf2fff67d82bd",
"85600f1e77533ef8"
]
]
},
{
"id": "6bdcda7432a3694b",
"type": "buffer-maker",
"z": "8f6909ec361ec4c9",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "item1",
"type": "int32be",
"length": 1,
"dataType": "msg",
"data": "payload"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 370,
"y": 120,
"wires": [
[
"5c2edcb1a6eb0eba",
"6976a615ad52d613"
]
]
},
{
"id": "9331c816dcb7049c",
"type": "debug",
"z": "8f6909ec361ec4c9",
"name": "debug 21",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 360,
"y": 160,
"wires": []
},
{
"id": "6976a615ad52d613",
"type": "debug",
"z": "8f6909ec361ec4c9",
"name": "debug 22",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 540,
"y": 160,
"wires": []
},
{
"id": "149bf2fff67d82bd",
"type": "debug",
"z": "8f6909ec361ec4c9",
"name": "debug 23",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 760,
"y": 160,
"wires": []
},
{
"id": "1779bdd3cbd63708",
"type": "debug",
"z": "8f6909ec361ec4c9",
"name": "debug 24",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 1140,
"y": 220,
"wires": []
},
{
"id": "5ece56966b7c67b7",
"type": "modbus-flex-write",
"z": "8f6909ec361ec4c9",
"name": "",
"showStatusActivities": false,
"showErrors": false,
"showWarnings": true,
"server": "0ca896640dce56e2",
"emptyMsgOnFail": false,
"keepMsgProperties": false,
"delayOnStart": false,
"startDelayTime": "",
"x": 970,
"y": 220,
"wires": [
[
"1779bdd3cbd63708"
],
[]
]
},
{
"id": "d6fa49d4481da465",
"type": "change",
"z": "8f6909ec361ec4c9",
"name": "",
"rules": [
{
"t": "delete",
"p": "payload",
"pt": "msg"
},
{
"t": "set",
"p": "payload.unitid",
"pt": "msg",
"to": "255",
"tot": "num"
},
{
"t": "set",
"p": "payload.fc",
"pt": "msg",
"to": "modbus.wrd.fc_wn",
"tot": "global"
},
{
"t": "set",
"p": "payload.address",
"pt": "msg",
"to": "0",
"tot": "num"
},
{
"t": "set",
"p": "payload.quantity",
"pt": "msg",
"to": "2",
"tot": "num"
},
{
"t": "set",
"p": "payload.value",
"pt": "msg",
"to": "value",
"tot": "msg"
}
],
"action": "",
"property": "",
"from": "",
"to": "",
"reg": false,
"x": 780,
"y": 220,
"wires": [
[
"5ece56966b7c67b7"
]
],
"info": "{ value: msg.payload, \r\n'fc': 5, \r\n'unitid': 1, \r\n'address': 0 , \r\n'quantity': 1 }"
},
{
"id": "65ea7fbb4843929b",
"type": "inject",
"z": "8f6909ec361ec4c9",
"name": "",
"props": [
{
"p": "payload"
}
],
"repeat": "",
"crontab": "",
"once": false,
"onceDelay": 0.1,
"topic": "",
"payload": "-3.142",
"payloadType": "num",
"x": 210,
"y": 220,
"wires": [
[
"03a2179ddd376c93",
"71feae464e7a38e3"
]
]
},
{
"id": "964ddf22a39acc72",
"type": "buffer-parser",
"z": "8f6909ec361ec4c9",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "uint16be",
"name": "item2",
"offset": 2,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
},
{
"type": "uint16be",
"name": "item1",
"offset": 0,
"length": 1,
"offsetbit": 0,
"scale": "1",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "value",
"msgPropertyType": "str",
"resultType": "value",
"resultTypeType": "return",
"multipleResult": false,
"fanOutMultipleResult": false,
"setTopic": true,
"outputs": 1,
"x": 550,
"y": 220,
"wires": [
[
"8a56fe0f46ed61d6",
"d6fa49d4481da465"
]
]
},
{
"id": "03a2179ddd376c93",
"type": "buffer-maker",
"z": "8f6909ec361ec4c9",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "item1",
"type": "floatbe",
"length": 1,
"dataType": "msg",
"data": "payload"
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 370,
"y": 220,
"wires": [
[
"964ddf22a39acc72",
"d966885f3eab5331"
]
]
},
{
"id": "71feae464e7a38e3",
"type": "debug",
"z": "8f6909ec361ec4c9",
"name": "debug 25",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 360,
"y": 260,
"wires": []
},
{
"id": "d966885f3eab5331",
"type": "debug",
"z": "8f6909ec361ec4c9",
"name": "debug 26",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 540,
"y": 260,
"wires": []
},
{
"id": "8a56fe0f46ed61d6",
"type": "debug",
"z": "8f6909ec361ec4c9",
"name": "debug 27",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 760,
"y": 260,
"wires": []
},
{
"id": "76d2b6224a2544bc",
"type": "buffer-parser",
"z": "8f6909ec361ec4c9",
"name": "",
"data": "payload",
"dataType": "msg",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"type": "floatbe",
"name": "item1",
"offset": 0,
"length": 3,
"offsetbit": 0,
"scale": "1",
"mask": ""
}
],
"swap1": "",
"swap2": "",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"resultType": "keyvalue",
"resultTypeType": "return",
"multipleResult": false,
"fanOutMultipleResult": true,
"setTopic": true,
"outputs": 1,
"x": 950,
"y": 360,
"wires": [
[
"255f8b7a82b99a42"
]
]
},
{
"id": "07802434ebcdba9f",
"type": "buffer-maker",
"z": "8f6909ec361ec4c9",
"name": "",
"specification": "spec",
"specificationType": "ui",
"items": [
{
"name": "item1",
"type": "uint16be",
"length": 6,
"dataType": "msg",
"data": "payload"
}
],
"swap1": "swap32",
"swap2": "swap16",
"swap3": "",
"swap1Type": "swap",
"swap2Type": "swap",
"swap3Type": "swap",
"msgProperty": "payload",
"msgPropertyType": "str",
"x": 770,
"y": 360,
"wires": [
[
"23bbb69a5093c514",
"76d2b6224a2544bc"
]
]
},
{
"id": "cbe085c3e3b99e77",
"type": "debug",
"z": "8f6909ec361ec4c9",
"name": "debug 28",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 780,
"y": 420,
"wires": []
},
{
"id": "23bbb69a5093c514",
"type": "debug",
"z": "8f6909ec361ec4c9",
"name": "debug 29",
"active": false,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "true",
"targetType": "full",
"statusVal": "",
"statusType": "auto",
"x": 940,
"y": 420,
"wires": []
},
{
"id": "255f8b7a82b99a42",
"type": "debug",
"z": "8f6909ec361ec4c9",
"name": "debug 30",
"active": true,
"tosidebar": true,
"console": false,
"tostatus": false,
"complete": "payload",
"targetType": "msg",
"statusVal": "",
"statusType": "auto",
"x": 1140,
"y": 360,
"wires": []
},
{
"id": "0ca896640dce56e2",
"type": "modbus-client",
"name": "bycplc",
"clienttype": "tcp",
"bufferCommands": true,
"stateLogEnabled": false,
"queueLogEnabled": false,
"failureLogEnabled": true,
"tcpHost": "192.168.10.19",
"tcpPort": "502",
"tcpType": "DEFAULT",
"serialPort": "/dev/ttyUSB",
"serialType": "RTU-BUFFERD",
"serialBaudrate": "9600",
"serialDatabits": "8",
"serialStopbits": "1",
"serialParity": "none",
"serialConnectionDelay": "100",
"serialAsciiResponseStartDelimiter": "0x3A",
"unit_id": "255",
"commandDelay": "5",
"clientTimeout": "500",
"reconnectOnTimeout": true,
"reconnectTimeout": "5000",
"parallelUnitIdsAllowed": true,
"showWarnings": true,
"showLogs": true
}
]
Thanks for looking,
Al