Arduino OPTAは、ディジタル入出力、アナログ入力のほかに、

  • Modbus/RTU  RS485のツイスト・ペア線を利用
  • Modbus/TCP  イーサネットを利用

のサーバおよびクライアントになれます。Arduino IDE 2.0.4のスケッチで動作を確認します。

接続

 RS-485で接続するModbus/RTUを利用します。Arduino OPTAには機能が内蔵されていて、A、B、GNDの端子が出ています。接続するのはA、Bの2本です。配線の両端にターミネータ120Ωが必要ですが、今回の実験は室内で、端から端までが3mほどの距離と短いので、何もつけていません。

 実験は9600bps パリティなし 8ビット ストップ・ビット1の通信条件行いました。

 温度調節器は通信機能があるモデルを選択し、マニュアルに従って、Modbusが使える設定に変更し、通信条件を上記のように設定しておきます。今回利用した温度調節器は、熱電対で温度を測ります。

 極性は、次のようになっているのが多いです。ケーブルはツイスト・ペア線を使いますが、実験ならば平行線でかまわないと思います。

  • Aがマイナス
  • Bがプラス

スケッチ

 ライブラリAIPlc_Optaをインストールします。

 ArduinoRS485.hはインストールされていましたが、ArduinoModbus.hは入ってなかったので、ライブラリで、「modbus」で検索して、ArduinoModbusをインストールしました。

 The complete code for the Client is shown below:

と書かれたスケッチをベースにして、不要なところを削除します。

 必要なのは、温度の値を読み出すために使われるreadHoldingRegisterValues()関数だけです。今回は書き込みはしません。多くのFA用機器では、HoldingRegisterに必要なデータが保存されているので、温度調節器のマニュアルに従って読み出します。

 


//  Name: Opta_Client

#include 
#include  // ArduinoModbus depends on the ArduinoRS485 library

constexpr auto baudrate { 9600 };

// Calculate preDelay and postDelay in microseconds as per Modbus RTU Specification
// MODBUS over serial line specification and implementation guide V1.02
// Paragraph 2.5.1.1 MODBUS Message RTU Framing
// https://modbus.org/docs/Modbus_over_serial_line_V1_02.pdf
constexpr auto bitduration { 1.f / baudrate };
constexpr auto preDelayBR { bitduration * 9.6f * 3.5f * 1e6 };
constexpr auto postDelayBR { bitduration * 9.6f * 3.5f * 1e6 };
// constexpr auto preDelayBR { bitduration * 10.0f * 3.5f * 1e6 };

void setup() {
    Serial.begin(9600);
    while (!Serial);

    pinMode(LED_D0, OUTPUT);

    Serial.println("Modbus RTU Client");
    delay(10);

    RS485.setDelays(preDelayBR, postDelayBR);

    // Start the Modbus RTU client
    if (!ModbusRTUClient.begin(baudrate, SERIAL_8N1)) {
        Serial.println("Failed to start Modbus RTU Client!");
        while (1);
    }
}

void loop() {
  digitalWrite(LED_D0, HIGH);
  delay(1000);
  digitalWrite(LED_D0, LOW);
  delay(1000);

    readHoldingRegisterValues();

    delay(5000);
    Serial.println();
}


/**
  Reads Holding Register values from the server under specified address.
*/
void readHoldingRegisterValues() {
    Serial.print("Reading Holding Register values ...");

    // Read HOLDING Register values from (server) id = 2, address 0x2000 2bytes?
    if (!ModbusRTUClient.requestFrom(2, HOLDING_REGISTERS, 0x2000, 1)) {
        Serial.print("failed! ");
        Serial.println(ModbusRTUClient.lastError());
    } else {
        Serial.println("success");

        while (ModbusRTUClient.available()) {
            Serial.println("オムロンE5CN-H");
            Serial.print(round(ModbusRTUClient.read() / 10.0),1);
            Serial.println("`C");
        }
        Serial.println();
    }

    Serial.print("Reading Holding Register values ...");
    // Read HOLDING Register values from (server) id = 1, address 0x0080 2bytes?
    if (!ModbusRTUClient.requestFrom(1, HOLDING_REGISTERS, 0x0080, 1)) {
        Serial.print("failed! ");
        Serial.println(ModbusRTUClient.lastError());
    } else {
        Serial.println("success");

        while (ModbusRTUClient.available()) {
            Serial.println("パナソニックKT-7");
            Serial.print(round(ModbusRTUClient.read() / 10.0),1);
            Serial.println("`C");
        }
        Serial.println();
    }
}

 実行例です。動作中は、四つあるLEDの一番左を点滅させています。

Modbus/RTUのとても簡単な説明

 物理的な配線に使われるRS-485は差動なので、ノイズに強いと言われています。

 最大247個のアドレスを扱えますが、機器によっては31個までという製品もあります。

 デバイスのアドレスという呼び名は、ライブラリやユーティリティによって次のようにも呼ばれます。

  • アドレス
  • スレーブ・アドレス
  • ID
  • Slave Addr
  • Device
  • Device Address

 アドレスは1からふられますが、論理的な指定を0から行うソフトウェアもあります。

 通信には、次のパラメータの設定が必要です。

  • ボーレート デフォルトは9600が多い。2400~19200bpsが選べる場合もある
  • データ・ビット 7もしくは8ビット。8ビットが多い
  • ストップ・ビット 「1、1.5、2」もしくは「1、2」から選択。1が多い
  • パリティ なし、偶数、奇数から選択。「なし」が多い

 海外製品は、「9600、8、1、なし」がデフォルトになっていることが多いです。逆に、日本製品では、そうなっていない場合があります。取扱説明書には書かれていないことも多く、確かめるには、機器のパネルを操作し該当するパラメータを表示します。確認できないこともあるので、その時は、テクニカル・サポートに電話で確認しておきます。

 でも、Arduino.ccのサンプルは、パリティありになっていました。

 代表的なファンクションの例です。ファンクションとは、どのレジスタに対して読むのか書き込むのかをいくつか定義したものです。下記に示した例よりもっとたくさん規格ではきめられていますが、多くの製品では、下記のファンクションの一部だけが実装されています。

  https://modbus.org/docs/PI_MBUS_300.pdf

 ファンクションの01~04が読み出すときに、05と06、16は設定値を書き込むときに使われます。
 温度などを読み出すときは、03もしくは04のどちらかが使われます。

ファンクションのコード 機能名 機能 備考
01 Read Coil Status スレーブのDOのON/OFFを読み出す  
02 Read Input Status スレーブのDIのON/OFFを読み出す  
03 Read Holding Register スレーブの保持レジスタの内容を読み出す 装置によって大きく長さや内容は異なる
04 Read Input Register スレーブの入力レジスタの内容を読み出す  
05 Force Single Coil スレーブのDOをONもしくはOFFする ONは0xff,0x00、OFFは0x00,0x00
06 Preset Single Register スレーブの保持レジスタの内容を変更する  
16  Preset Multiple Registers スレーブの連続した複数の保持レジスタの内容を変更する  
以下略      

 温度を読み出すときに使われるModbusの規格と、今回利用する温度調整器の名称を次に示します。03と04の使い分けは、メーカによってまちまちです。

  ファンクション・コード データのある場所の名称
規格

03 Read Holding Register

もしくは04 Read Input Register

「保持レジスタ」は40001からスタート。

もしくは「入力レジスタ」は30001からスタート

オムロンE5CN-H ファンクション・コード03の変数読み出し 「設定データのアドレス」は0000からスタート
パナソニックKT-7 機能コード03のスレーブの設定値,情報の読み取り 「データ項目」は、0x0001からスタート

本ブログの関連記事

センサ・シリーズ 温度②温度調節器 その1 Modbusの設定

センサ・シリーズ 温度②温度調節器 その2 Modbusで読み書き

Modbusの利用 (11) 温度調節器KT7

Modbusの利用 (5) E820-AIO アナログ入力①

Modbusの利用 (9) 回すだけ EVALKIT-ROBOT-1ブラシレス・モータ・キット②

Simulink Support Package for Raspberry Pi ⑦ Modbus/TCP 熱電対

資料

温度調節器 KT7 通信取扱説明書

デジタル調節計 通信マニュアル SGTD-737B

 前回、Arduino IDE 2.0.4を使って、Arduino OPTAの出力ポートの動作確認をしました。

イーサネットの接続

 Arduino OPTAのイーサネットは、10/100MHzに対応しています。

 HUBにLANケーブルで接続します。

DHCPクライアントのサンプル・スケッチを動かす

 サンプルからDhcpAddressPrinterを読み込みます。

 コンパイル&アップロードをします。

 192.168.111.108がふられていると表示されました。pingをうつと、とても時間がかかっていますが、レスポンスがあります。

ライブラリAIPlc_Optaをインストールしたのち

 2023/3/28にインストールができるようになったAIPlc_Optaを入れた後に、同じDhcpAddressPrinterをコンパイルして動かします。

  pingの遅延時間が1msと、普通の速度でつながるようになったようです。

 2023年3月現在、Arduino PLC IDEは発表当時から変わらず1.0です。

 Arduino OPTAの動作を確認するために、Arduino IDE 2.0.4をインストールして、スケッチを記述できる環境を構築します。

Arudino OPTAをつなぐ

 USB-Cのケーブルで、PCとArudino OPTAをつなぎます。PCのUSBポートに直接つなぎます。最近、Nicla Sense MEをUSB HUB経由でつなぐと、アップロードに失敗したことがありました。

 USB(COMポート)を認識しないときには、RESETのくぼみを細い線で素早く二度クリックします。

 2か所のLEDが光っています。LANは緑色が点灯したままです。

 RESETの上のLEDは、赤く光るときがLEDR、緑のときはLED_RESETと呼ばれます(第1回目の図を参照)。

 緑色のLEDが1秒ごとに点滅しています。

Arudino OPTAのドライバのインストールが必要

 Arduino PLC IDEがダウンロードできるようになった時に、動作するハードウェアはPortenta Machine Controlでした。なので、Arudino OPTA関係のドライバを含んでいません。ここで、Arduino IDE(執筆時点で最新版の2.0.4)を使って、それらをインストールします。インストールが終わったら、スケッチで動作確認をします。

 Arduino.ccのSoftwareのページを開きます。

 このページの最初の部分に、Arduino IDE 2.0.4のダウンロードのリンクが見えています。Windows用をダウンロードし、インストールします。

 この手順は、

  Getting Started with Opta

の解説に従っています。

 インストールが終わったら、画面左のボードのアイコンをクリックしてボードマネージャを出し、optaで検索し、Arduino Mbed OS Opta Board by Arduinoをインストールします。

 一度PCをリブートします。

 1秒ごとに点滅していたRESETの上の緑のLEDは、約0.5秒の点滅に変わりました。

 Select BoardでOPTAを選択し、COMポートはデバイスマネージャで確認をしたCOM番号を選択します。

 Arduino IDE 1.x、Arduino IDE 2.x、Arduino PLC IDE 1.xは、いずれも、コンパイル環境は共通のディレクトリにインストールされます。

スケッチを動かす

 先ほどの解説ページにあるTesting with Blink SketchのスケッチをArduino IDE 2.0.4にコピーし、コンパイル&アップロードします。

 アップロードに失敗しました。エラーコードは47です。

 PCを再度リブートします。

 Arduino IDE 2.0.4を立ち上げると、ライブラリにアップデートというメッセージが出ていたので、更新します。

 しかし、アップロードに失敗しました。エラーコードは同じく47です。

 筆者が試したのは、

  • PCのUSBポートが青色から黒色に差し替えた
  • OPTAのUSBポートを一度抜いて、裏返して差し込んだ

によって、アップロードが正常に行われました。COMポートは、COM3からCOM4に変化しました。

 スケッチは、STATUSのLEDを順次点灯、LED_RESETを消灯するという内容です。

  • LED_D0: STATUS 1
  • LED_D1: STATUS 2
  • LED_D2: STATUS 3
  • LED_D3: STATUS 4
  • LED_RESET: LED above the reset button

 正常に動作しました。

出力のリレーを使う

 上記の写真の下側に四つの出力ポートが並んでいます。ここの右端の4(RL4)の端子に、AC100VのLED電球をつなぎます。

 スケッチです。


void setup() {
  pinMode(D3, OUTPUT);
}

void loop() {
  digitalWrite(D3, HIGH);
  delay(3000);
  digitalWrite(D3, LOW);
  delay(3000);
}

 3秒ごとに点滅を繰り返しました。

 リレーの音がします。外部電源を切ると音がしなくなるので、リレーは動作しないようです。

初めてのArduino PLC IDE ② 配線材料

  • 投稿日:
  • by
  • カテゴリ:  

 Arduino UNOでは、ピンヘッダーと呼ばれるI/Oポートに下のジャンパ線を差し込んで実験回路をくみ上げました。

 Arduino Optaでは、抜けたりしないような確実な接続ができるねじ止め式のターミナル端子が採用されています。

 このターミナル端子にジャンパ線をつないでも、すぐに抜けたり、折れてします。

ねじ止めのターミナル端子

 見えないですが、家の内部のAC100V配線は1.6mmΦなどの単線が使われます。被覆を向いて、差し込むだけで済むという、配線時間の短縮ができます。もし間違ったときは、すぐ横にある穴へドライバの先を突っ込むと、抜けます。

 FA用機器も、多くは、差し込むだけで配線ができるものが多いです。AC100Vと異なるのはより線が使われるところです。

 ドライバは、幅2.0mmのマスナス・ドライバが使いやすいです。

 より線は、被覆をむくときに、細い銅線が切れることもあり、それが、機器の内部に入り込んでショートの原因になることもあります。そこで、フェルール端子を圧着ジグで取り付けて使います。

フェルール端子

 何種類か、線材の太さに合わせて、パックになった製品があります。

 これより細い線材、AWS24以下の0.32、0.25、0.14mmも入手できます。

 アマゾンで入手した圧着治具です。

 被覆をむくときに使っているワイヤストリッパーです。細い信号線は0.5mmのゲージを利用することが多いです。

  今回利用する電源ケーブルを作成しました。

 先端部分の拡大です。

初めてのArduino PLC IDE ① どのようなところに使うのか

  • 投稿日:
  • by
  • カテゴリ:  

 2020年12月に入ってArduino.ccから新しい開発環境のArduino PLC IDE 1.0がダウンロードできるようになりました。

 Arduino Optaというハードウェアのアナウンスで登場した開発ツールです。2023/03現在、このハードウェア以外には、Portenta Machine Controlがサポートされています。

 2023/03/03にArduino Optaの販売が開始されました。

 このブログでは、Arduino PLC IDE開発環境を使ってST言語などで制御を記述し、I/Oのコントロールを行います。

動作環境

 普通の日本語環境Windows10 PC 2台にインストールしましたが、落ちます。このブログ記事は、英語版のWindows10で動作をさせています。

 Arduino Optaは3種類ありますが、ここでは、Arduino Opta RS485を利用します。

 もう一つのハードウェアPortenta Machine Controlは、Modbusサーバは利用できなく、CANopenが記述できるようなのですが、詳細は不明です。

Arduino PLC IDEは無償のソフトPLC開発環境

 開発ソフト自体は、無償ですが、動作をさせるハードウェアにPLC key Portenta Machine Controlのライセンスが必要です。購入すると、コードが送られてきます。

 従来のArduino IDE 2.0はスケッチというプログラムでArduino UNOなどのマイコン・ボードを動作させますが、Arduino PLC IDEでも、利用できます。メインは、新しいIEC 61131-3の言語群が使えます。

 IEC 61131-3はFA用の言語群で、五つの種類が使え、混在?ができます。

  • IL(Instruction List;インストラクション・リスト)
  • LD(Ladder Diagram;ラダー・ダイアグラム)
  • SFC(Sequential Function Chart;シーケンシャル・ファンクション・チャート)
  • FBD(Function Block Diagram;ファンクション・ブロック・ダイアグラム)
  • ST(Structured Text;ストラクチャード・テキスト)

 調べると、FA用にはラダー言語が使われるのが普通のようです。

FA用途とは

 工場やビルなどの機材を制御するためにフィールド・バスと呼ばれる通信媒体があります。

  • イーサネット
  • RS-485
  • 独自

 イーサネットは、通信自体が行き当たりばったりで、一定時間内応答することが確約されていません。実際は、十分高速で混雑していなければ問題はないと思われますが、FA用途ではリアルタイム性をうたった仕様のイーサネットがいくつか利用されています。

  • PROFIBUS
  • DeviceNet
  • EtherNet/IP
  • EtherCAT

 時間の規定がないのがModbus/TCPです。RS-485を使うのがModbus/RTUです。

 日本では三菱電機のCC-Linkが有名ですが、どういうものかは知らないです。

Arduino Opta RS485の対応しているプロトコルと入出力

 Arduino Opta RS485では、Modbus/TCPとModbus/RTUが利用できます。そのほかにも、ディジタルもしくはアナログ(0~10V)の入力が8個、250 V AC - 10 Aの出力が4個内蔵されています。

電源電圧は12~24V

 FA用の電子機器は、24Vが使われるようです。Arduino Optaは。12~24Vに対抗しているので、電源はACアダプタが利用できます。電源端子はターミナル端子でねじ止めをするので、DCジャックの直径の規格などを気にすることなく使えます。

 電源の容量は、現時点でみつかっていません。

2023/3/16) USBケーブルをつないだだけで動作するようです。

  Getting Started with Optaに、

  • Power supply of 12-24V DC, 1A (optional if not running the section related to the relays) (x1)

 と書かれています。出力のリレーを利用するときには、外部電源が必要なようです。