Intern

Node-REDでModbusの通信を試してみよう

はじめに

今回は前回にやったModbus通信をNode-REDでも動かしてみたいと思います

前回:https://blog.smartlight.co.jp/?p=5184&_thumbnail_id=5202

目次

フロー全体

ノード書き出し

[{"id":"ae1b6df3bb9c4b5a","type":"inject","z":"9847d11a04b36646","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"str","x":340,"y":300,"wires":[["a93effa614da2604"]]},{"id":"f8ed3667788a4fd0","type":"debug","z":"9847d11a04b36646","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":800,"y":340,"wires":[]},{"id":"922ed923301accb7","type":"inject","z":"9847d11a04b36646","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"str","x":330,"y":460,"wires":[["9c6490e8241964b4"]]},{"id":"9c6490e8241964b4","type":"function","z":"9847d11a04b36646","name":"FC3 0","func":"msg.payload = { \n 'fc': 3,\n 'unitid': 0,\n 'address': 0 ,\n 'quantity': 4\n};\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":480,"y":500,"wires":[["edc21ae6596480ce"]]},{"id":"826b7a0cae32b0c2","type":"function","z":"9847d11a04b36646","name":"FC16 0","func":"msg.payload = {\n value : msg.payload,\n 'fc': 16,\n 'unitid': 0,\n 'address': 0 ,\n 'quantity': 2\n};\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":660,"y":820,"wires":[["98fa71a376265232"]]},{"id":"602494bf34f00e32","type":"inject","z":"9847d11a04b36646","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"0","payloadType":"num","x":350,"y":720,"wires":[["5c419a49d91c4cba"]]},{"id":"5c419a49d91c4cba","type":"join","z":"9847d11a04b36646","name":"","mode":"custom","build":"array","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":490,"y":820,"wires":[["826b7a0cae32b0c2"]]},{"id":"ecb171afe55be84e","type":"inject","z":"9847d11a04b36646","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"100","payloadType":"num","x":350,"y":820,"wires":[["5c419a49d91c4cba"]]},{"id":"a4e6a3afceb67fea","type":"modbus-response","z":"9847d11a04b36646","name":"","registerShowMax":20,"x":880,"y":620,"wires":[]},{"id":"edc21ae6596480ce","type":"modbus-flex-getter","z":"9847d11a04b36646","name":"FlexGetter","showStatusActivities":false,"showErrors":false,"showWarnings":true,"logIOActivities":false,"server":"b62d434859b22bc4","useIOFile":false,"ioFile":"","useIOForPayload":false,"emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"startDelayTime":"","x":650,"y":600,"wires":[["496afddf78deab13"],["a4e6a3afceb67fea","496afddf78deab13"]]},{"id":"98fa71a376265232","type":"modbus-flex-write","z":"9847d11a04b36646","name":"FlexWrite","showStatusActivities":false,"showErrors":false,"showWarnings":true,"server":"b62d434859b22bc4","emptyMsgOnFail":false,"keepMsgProperties":false,"delayOnStart":false,"startDelayTime":"","x":840,"y":820,"wires":[[],[]]},{"id":"a93effa614da2604","type":"modbus-server","z":"9847d11a04b36646","name":"","logEnabled":false,"hostname":"0.0.0.0","serverPort":"502","responseDelay":100,"delayUnit":"ms","coilsBufferSize":10000,"holdingBufferSize":10000,"inputBufferSize":10000,"discreteBufferSize":10000,"showErrors":false,"showStatusActivities":false,"x":550,"y":320,"wires":[["f8ed3667788a4fd0"],["f8ed3667788a4fd0"],["f8ed3667788a4fd0"],["f8ed3667788a4fd0"],["f8ed3667788a4fd0"]]},{"id":"496afddf78deab13","type":"debug","z":"9847d11a04b36646","name":"debug 7","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","statusVal":"","statusType":"auto","x":830,"y":520,"wires":[]},{"id":"b62d434859b22bc4","type":"modbus-client","name":"","clienttype":"tcp","bufferCommands":true,"stateLogEnabled":false,"queueLogEnabled":false,"failureLogEnabled":false,"tcpHost":"127.0.0.1","tcpPort":"502","tcpType":"DEFAULT","serialPort":"/dev/ttyUSB","serialType":"RTU-BUFFERD","serialBaudrate":"9600","serialDatabits":"8","serialStopbits":"1","serialParity":"none","serialConnectionDelay":"100","serialAsciiResponseStartDelimiter":"0x3A","unit_id":"1","commandDelay":"1","clientTimeout":"1000","reconnectOnTimeout":true,"reconnectTimeout":"2000","parallelUnitIdsAllowed":true,"showErrors":false,"showWarnings":true,"showLogs":true}]

フロー解説

Modbusサーバを起動

このフローのinjectノードを起動するとModbusServerが起動します
これはSlaveに値するものです

Modbus Serverの設定はportを502にしただけです

サーバに書き込みをする

このフローでは立ち上げたサーバにデータを格納します
二つのinjectノード(0/100)、この値を押すと値をサーバ格納します

・joinノード
このノードは前のinjectノードからのデータを連結して次のfunctionノードのデータを送っています

今回は二つのメッセージを連結するようになっているのでinjectノードが二回押されたら次のフローに送るようになっています

・functionノード

joinノードから来たデータに他の要素を付属するようなコードになっています

fc: 16 は、Modbusの書き込みコマンド(Function Code 16)を意味します。このコマンドは、複数のレジスタにデータを書き込むためのものです。

unitid: 0 は、ターゲットとなるデバイスのユニットIDを指定します。ここではIDが0のデバイスに対して操作を行います。

address: 0 は、書き込みを開始するアドレスを指定します。ここではアドレス0から書き込みを行います。

quantity: 2 は、書き込むレジスタの数を指定します。ここでは2つのレジスタにデータを書き込みます。

value: msg.payload は、実際に書き込むデータを指定しています。ここでは、入力メッセージのペイロードがそのまま書き込まれます

・Modeles-Flex-Writeノード
ここではfunctionノードから来たmsg.payloadに入っている情報通りにServerに書き込みをします

先程立ち上げたサーバを対象としています

③データの読み取り

このフローではinjectノードを押すとサーバに登録しているデータを取って来ます

・functionノード
このノードではデータを取ってくるためのメッセージを次のノードに渡しています

fc: 3 は、Modbusの読み取りコマンド(Function Code 3)を意味します。このコマンドは、保持レジスタ(Holding Registers)からデータを読み取るためのものです。

unitid: 0 は、ターゲットとなるデバイスのユニットIDを指定します。ここではIDが0のデバイスに対して操作を行います。

address: 0 は、読み取りを開始するアドレスを指定します。ここではアドレス0から読み取りを行います。

quantity: 4 は、読み取るレジスタの数を指定します。ここでは4つのレジスタからデータを読み取ります。

・FlexGetterノード
functionノードから来たメッセージでサーバのデータを取ってきます

サーバがターゲットに成っている

・Responseノード
前のサーバから取ってきたデータを見やすくノードの下に表示する

動作

①初期状態

②サーバ起動
一番上のinjectノードを押したら、windowlogにメッセージが出ます

③合計二回押す
サーバに値を書き込んでいきます(0・100の順番で押しました)

④サーバからデータを取って来る
injectノードを押すとサーバからデータを取って来ます
(Responノードの下の部分が変化している)

無事に書き込んだ値を読み出し出来ている事が確認が取れた

まとめ

前回に続き、Modbusを勉強しました
Node-redで動作フローを理解するのに中々に時間が掛かりました
次回はComfortClickにもModbusあるので、Win上のModbusシミュレーターとつながるか試してみます