1

modbus rtu 経由で json を送信しようとしています (modbus の使い方が非常に悪いことはわかっています)。

私のスキーマは次のようになります。 ここに画像の説明を入力

Arduino USBをCOM5としてPCに接続し、USB-RS485に接続されたRS485コンバータをCOM4としてPCに接続しました。

ここに画像の説明を入力

QModBusアプリケーションを使用して Arduino からデータを読み取ると、大量のバイト (COM4) が表示されます。

制御用: QModBus から「保持レジスタの読み取り」を送信した後、「Arduino USB ポート」(COM5) の Arduino シリアル モニタは有効な文字列を出力します。つまり、modbus バイトは問題ないということです。

ここに画像の説明を入力

私のArduinoコードがあります:

#include <ArduinoJson.h>
#include <ModbusRtu.h>
#define ID   1

// assign the Arduino pin that must be connected to RE-DE RS485 transceiver
#define TXEN  2 

Modbus slave(ID, 0, TXEN); // this is slave ID and RS-232 or USB-FTDI

// data array for modbus network sharing
uint16_t au16data[100];

boolean state;
String json = "{\"idx\":1430,\"nvalue\":0,\"svalue\":\"-58.00\"}";

void setup() {
  slave.begin( 9600 );
  StaticJsonBuffer<200> jsonBuffer;  
  JsonObject& root = jsonBuffer.parseObject(json); 
}

void loop() {
  // https://github.com/smarmengol/Modbus-Master-Slave-for-Arduino/blob/master/ModbusRtu.h#L1391
  byte x = 0;
  for (byte i = 0; i < json.length(); i += 2) {
    uint16_t temp;
    temp = word(
      json[i],
      json[i+1]);  
    au16data[x] = temp;
    x++;
  }

  state = slave.poll( au16data, 100 );  
} 

しかし、これらのバイトをPythonでjson文字列に変換する方法がわかりません。私のコード:

import serial
import minimalmodbus

MODBUS_3  = 3  # Read holding registers

dev1 = minimalmodbus.Instrument('COM4', 1)  # port name, slave address (in decimal)
dev1.serial.baudrate = 9600
dev1.serial.bytesize = 8
dev1.serial.stopbits = 1
dev1.serial.parity = serial.PARITY_NONE
dev1.debug = False

data = dev1.read_registers(0, 20, MODBUS_3)
print(data)

コードは QModBus と同じ値を出力します:

[31522, 26980, 30754, 14897, 13363, 12332, 8814, 30305, 27765, 25890, 14896, 11298, 29558, 24940, 30053, 8762, 8749, 13624, 11824, 12322]

arduinoのシリアルモニターでわかるように、これらの数値をjson文字列に変換するにはどうすればよいですか?

また、modbus 経由で送信するために Python 文字列を「uint_16t」に変換する方法。

ありがとうございました!

4

1 に答える 1