回路網の旅

電気・電子に偏った社会人がおくる日々の記録。

ModbusRTU工作5

2016年12月31日 12時22分04秒 | 工作
modbusRTUをやるにあたって、CRCの計算というやつがありまして

こいつをプログラムで動かす分にはいいんですが

デバッグ中にこのデータなら幾らなんだ?という場面がちょいちょいあります。


Modbusに必要なCRCは16ビットですが、PCのメモリなんかは32ビットだったりするのでアプリやソフトも少なめですが、無いことはないです。


方法1:Cで動かす
Modbus.orgの仕様書「MODBUS over Serial Line Specification & Implementation guide V1.0」の42ページにサンプルプログラムと数列表
を使う。(マイコン側はこれにしました。)


方法2:フリーソフトの力を借りる

Simply modbusというサイトに計算するエクセルファイルが公開されてます。
http://www.simplymodbus.ca/index.html

CRC Calculator - Checksum Generator(iPhone アプリ)も有料ですが、便利です。
https://itunes.apple.com/jp/app/crc-calculator-checksum-generator/id984488943?mt=8


あと、調べるとオンライン計算サイトもあってありがたいですね。


方法3:手計算
一回はやっておくべしと思いながら、数週間・・・・笑

ModbusRTU工作4

2016年12月31日 12時04分41秒 | 工作
舞台をルネサスマイコンに移してから、久しぶりなマイコンプログラミングになりました。

回路図とにらめっこすることが大半となった社会人生活にはいい頭の体操です。

さて、シリアル通信の方法ですが検証はTeraTermを使いました。今回初めて知ったのですが、TeraTermにはバイナリモードがありこれに切り替えるとModbusRTU通信をみることができます。


色々試していると、どうも最後の送信文字がうまく届いてない様子があります。Win7とTeraTermの組み合わせで発生するみたいで・・・・
詳細は検証中です。(ちがったらごめんなさい)


OS環境:Windows 7 Professional 32bit
ソフト:TeraTerm 4.8.7

メモ
・Debug modeをONしてバイナリ表示させる。(管理者モードで実行)
・エンコードはShift_JIS
・ボーレートなど設定後に保存しておくと便利(※1)
・ModbusRTUマスターのコマンドはマクロで送信(※2)




※1
ボーレート:19200bps
データ:8bit
パリティ:none
ストップ:1bit
フロー制御:none
送信遅延:0ms/字、0ms/行
漢字コード:Shift_JIS
ローカルエコー:あり


※2
; macro for Tera Term
; modbusRTU function01
; Read coil 4

send $01$01$00$00$00$04$3D$C9
mpause 15
end

ModbusRTU工作3

2016年12月31日 11時53分16秒 | 工作
さて、準備が整ったところでオリジナルの製作に入ります。

使うマイコンはArduinoUNO相当がよかろうということで、
ルネサス製RL78/G13にしました。最近のルネサスマイコンを使ってみたかったんです。

エミュレータを買う余裕はないので、Stickという開発キットにしました。デバッグできて、回路図もしっかりしてて良い感じですが、
スタンドアロンで動かすときと接続して書き込むときに、ショートプラグを4つ抜き差ししないといけないのをよく忘れます。小さくて面倒だし、セレクタICでもつないでやろうかしら。



・ルネサスエレクトロニクス RL78/G13 Stick スターターキット 【RL78/G13-STICK】 \4,000-くらい
https://www.amazon.co.jp/%E3%83%AB%E3%83%8D%E3%82%B5%E3%82%B9%E3%82%A8%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AD%E3%83%8B%E3%82%AF%E3%82%B9-Stick-%E3%82%B9%E3%82%BF%E3%83%BC%E3%82%BF%E3%83%BC%E3%82%AD%E3%83%83%E3%83%88-%E3%80%90RL78-G13-STICK%E3%80%91/dp/B016W852AG/ref=sr_1_6?ie=UTF8&qid=1483152594&sr=8-6&keywords=RL78+G13



ここからが大変だった。ルネサスの統合開発環境はHEWのときにちょっといじったくらいだったので
CS+ for CC と CS+ for CA に翻弄されることに・・・・(笑
細かく書いても有益な情報はないので、備忘録てきにメモっときます。


・開発環境(無償)はCS+ for CAがよさそう
・StickのサンプルコードをCS+ for CAで試す
・LED点滅確認→OK
・シリアル通信のサンプルコードがCS+ for CCであることに気づく
・CS+ for CAとCCの違いがよく分からない
・コンパイラが2つあるという事実に気づく
・面倒なのでCS+ for CCでサンプルコードを動かす
・CS+ for CAとビット表現が異なり混乱
・コード自動生成機能を後からいじっておかしくなる
・少しづつ事実が見えてくる
・CS+ for CCで開発を進める


こんな感じです。現状はサンプルコードにつぎはぎなので、どこかで整理できたらコードを公開できるかもしれませんが、めどは立っていません(笑

新しいことを新しいデバイスでやるもんじゃないですね・・・笑

ModbusRTU工作2

2016年12月31日 11時07分59秒 | 工作
ModbusRTU工作ですが、通信に無知な私にはお手本がないとしんどいので
色々調べているとArduino のライブラリと実際に動作確認して紹介している方がおられたので
これを参考にさせてもらいました。感謝です。

Another Modbus slave example
(Samuel Marco i Armengol氏のライブラリを使ったModbusスレーブ)
http://arduino-experience.blogspot.jp/2014/03/another-modbus-slave-example.html

またプロトコルはこちらの動画がわかりやすかったです。(Ulas Dikme氏)
http://ulasdikme.com/projects/arduino/Arduino_modbus_example.php


ModbusRTUにはマスターとスレーブがありますが、マスタはPCで「QModbus」というソフトを使用し、USB-RS485変換アダプタをつかって確認します。Arduino側はUARTと出力ポート1Ch、変換ICで対応します。
で、ざっくりなで動作させてみたら動いてしまって拍子抜けしました。
いやいや、後に自作すると苦労するんですけどね・・・・。先人の苦労とライブラリ様様です。

部品などは下記のとおり。主要なとこは千円くらいですね。お手軽っちゃお手軽。



【部品表】
・Arduino UNO互換器※ \500-
https://www.amazon.co.jp/gp/product/B018VYJIEU/ref=oh_aui_search_detailpage?ie=UTF8&psc=1

・RS485/RS422トランシーバ TI製 SN75176BP \60-
http://akizukidenshi.com/catalog/g/gI-07430/


・USB To RS485変換アダプタ \320-
https://www.amazon.co.jp/gp/product/B00GWEGZOI/ref=oh_aui_search_detailpage?ie=UTF8&psc=1

・その他
ブレッドボード、配線、コンデンサ、抵抗など。


【ソフト】
・Arduino IDE 1.6.5
・Qmodbus0.2.1


※互換器である必要はありません。あったのでこれをつかってます。




ModbusRTU工作1

2016年12月31日 09時48分50秒 | 工作
ひょんなことから、ModbusRTUという通信プロトコルと関わる機会が増えてきたので
理解する為につくってみることにしました。

ModbusRTUは、シリアル通信プロトコルの1種で物理層はRS-485そのままです。
PLC向けの規格のため、FAや工場設備の制御など産業用途が多いです。この辺は、仕事で関わりがある知ってる人しか知らない情報かもしれません。通信速度は19.2kbpsと低速ですが、RS-485はマルチドロップのため、芋ずるでたくさんのリレーやランプ、スイッチ(接点)の制御するのに便利です。オープン規格なところもいいですね。プロトコルも複雑ではないのでマイコンに組み込めそうです。

マスタースレーブ方式のため、マスタ(PLCかPC)から問い合わせをかけたらスレーブが応答します。ファンクションコードという機能分類があり、デジタル値の読み出しやレジスタへの書き込みがあります。
スレーブIDの設定範囲は1~247、データアドレスは1~9999なので、がんばったら数百万ビットの制御ができそう。

ざっくり計算で、ファンクションコード1とし、19.2kbpsで1バイト分が10ビット送信として0.52msかかり、問い合わせに8バイト分80ビットで4.17ms、応答に6バイト分60ビットで3.12msとなり合計7.29ms(2バイト毎)。

プロトコルは、Modbusの業界団体のWEBページからみることができます。もっとも、RTUのイーサネット版のModbusTCPが主なようです。
http://modbus.org/

産業用ネットワーク(フィールドバスというらしい)は、まだまだ業界標準が定まってないようでいろいろな規格があります。用途が限定されず速度やリアルタイム性など要求が多様なためなんでしょうか。

まとめると、ちょっとON/OFF制御をいっぱいしたいときに使う通信ですね!