Project#Revpi Connect x Schneider Mdoicon M221 x Modbus RTU

今回の記事はRevi ConnectとSchneider Modicon M221をModbus RTUで通信します。Revpi ConnectがMaster側でSchneider Modicon M221がSlaveになり、Revpi ConnectはRs485>USBの変換機を使用します。

そしてSchneider側でIO Checkのプログラムを作成しデータの一致性のCheckを行います。

よろしくお願いします。

Thanks!

この記事で使用するRevPI ConnectはPILZ JAPANが貸してくださった機材で、Schneider Modicon M221はマナ・デザインワークスからの機材になります。

PILZ

PILZは安全およびオートメーション技術のソリューションでトータルソリューションサプライヤとしてのFA現場を支え、人の安全だけではなく、機械、および環境の安全を保証し、機械や設備をいかに安全に稼働させます。ピルツは全世界に42の現地法人や支社を設置し、包装、自動車産業、ロボットアプリケーション、さらに風力発電、鉄道技術など様々な分野で活躍しています。

Office:

ピルツジャパン株式会社

〒222-0033

横浜市港北区新横浜3-17-5

いちご新横浜ビル 4階

HP

https://www.pilz.com/ja-JP

Mana Design Works

Mana Design Worksは大阪に本社あるSiemensの正式なソリューション パートナーで、内容は自体はシュナイダーですが、Siemens製のCPU・HMI・Drive・Motion Controller・SCADAから国産メーカまで常に最適な提案できます。

Office

〒564-0052 Osaka, Suita, Hiroshibacho, 10番35−号 江坂南口第二ビル

HP

こちらはMana Design Works 様のホームページです。

どうぞよろしくお願いします。

https://mndw.jp/

Tools

USB To RS485 485 コンバータ 変換 アダプタ win7 8 XP Vista Linux Mac OS を サポート

RevPI Side

Connect it!

RS485>USBの変換機をRevpi ConnectのUSB Portに接続します。

Find your ports

Putty SSHをPCとRevpi Connectで接続し、いま稼働してるPortをList Upします。

python -m serial.tools.list_ports

よし、/dev/ttyUSB2はそのUSB>RS485変換が認識されていますね。

/dev/ttyUSB0=Port1,/dev/ttyUSB0=Port2,/dev/ttyUSB2=Port3なので、Port Numberは3になります。

/dev/ttyAMA0
/dev/ttyUSB0
/dev/ttyUSB1
/dev/ttyUSB2
4 ports found

Check it

もしそのPortがほんとにUSB>RS485の変換器かどうか確定できないなら、以下のコマンドを実行してください。

pi@RevPi8172:~ $ dmesg | grep tty

ch341-uart converter now attached to ttyUSB2というメッセージが見えたでしょうか。そのch341-uart converterはまさにUSB>RS485の変換器で、ttyUSB2にAttachしたと。

[    0.000000] Kernel command line: coherent_pool=4M bcm2708_fb.fbwidth=656 bcm2708_fb.fbheight=416 bcm2708_fb.fbswap=1 smsc95xx.macaddr=B8:27:EB:FF:FD:0E vc_mem.mem_base=0x3ec00000 vc_mem.mem_size=0x40000000  dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p2 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait nosplash plymouth.ignore-serial-consoles
[    0.001422] console [tty1] enabled
[    1.585736] 3f201000.serial: ttyAMA0 at MMIO 0x3f201000 (irq = 81, base_baud = 0) is a PL011 rev2
[    5.397721] usb 1-1.5.2: FTDI USB Serial Device converter now attached to ttyUSB0
[    5.401178] usb 1-1.5.3: FTDI USB Serial Device converter now attached to ttyUSB1
[   10.819530] usb 1-1.2: ch341-uart converter now attached to ttyUSB2

Edit CODESYSControl.cfg

次あhCodesysのcfg Fileを修正します。

nano /etc/CODESYSControl.cfg

その2つの設定を追加してください。

[SysCom]
Linux.Devicefile=/dev/ttyUSB

Edit config.txt

今度はRevpi ConnectのConfig Fileを修正します。

sudo nano /boot/config.txt

Fileの一番下に以下の設定を追加して、電源を入れ直してください。

enable_uart=1

Codesys

Add Modbus COM

Devices>Add Deviceします。

Modbus>Modbus Serial Port>Modbus COMを選び>Add Devicesします。

Modbus COM Objectが追加されました。

Add Modbus Master

次はModbus MasterをProjectに追加します。

Modbus Serial Master> Modbus Master, COM Portを選び>Add Devicesします。

Modbus Masterを追加しました。

Add Modbus Slave

次はRevPI ConnectにあるModbus Masterと通信するModbus Slaveを設定します。

Modbus Slaveを追加しました。

Program

次はプログラムを作成します。

GVL

まずGlobal Variable ListからModbus RTU通信用の変数とRevPI Connectデバイス用の変数を定義します。

{attribute ‘qualified_only’}
VAR_GLOBAL
RevPiStatus :BYTE;
RevPiIOCycle :BYTE;
RS485ErrorCnt :WORD;
Core_Tempature :BYTE;
Core_Fequency :BYTE;
LED:BYTE;
init:BOOL;
Unit1_MultipleRegister :ARRAY[0..9]OF WORD;
Unit1_ReadingRegister :ARRAY[0..9]OF WORD;
END_VAR

MAIN

次はRevPI Connect側は単なるInput DataをそのままOutputにLoopbackする簡単なプログラムです。

PROGRAM PLC_PRG
VAR
Status:BYTE;
IOCycle:BYTE;
RS485_ErroCnt:WORD;
Core_Temperature:BYTE;
Core_Fequency:BYTE;
A1,A2,A3 :INT;
B1:BOOL;
data1,data2:ARRAY[0..9]OF WORD;
END_VAR


Status:=GVL.RevPiStatus;
IOCycle:=GVl.RevPiIOCycle;
RS485_ErroCnt:=GVL.RS485ErrorCnt;
Core_Temperature:=GVL.Core_Tempature;
Core_Fequency:=GVL.Core_Fequency;

data1:=GVL.Unit1_MultipleRegister;
data2:=GVL.Unit1_ReadingRegister;
GVL.Unit1_MultipleRegister:=GVL.Unit1_ReadingRegister;

Modbus COM Configuration

Modbus COM Objectを開き>General TabからCOM Port・Baud rateなどの通信設定を入力します。

Modbus Master Configuration

次はModbus Masterを開き>General TabからTransmission modeをRTU Modeに設定します。そしてTimeout時間を調整し・あと一番したにあるAuto-restart communcationのCheckboxをCheck入れます。

Modbus Slave Configuration

今度はSlaveの接続設定になります。まずGeneral TabからSlaveアドレスとTimeoutを設定しましょう。

次はModbus Slave Channel Tabを開きます。Add Channelから接続Channelを追加できます。今回はFunction Code 16、Offset=100から10個のWordデータとFunction Code 04、Offset=0から10個のWordデータを構築します。

最後はMdobusGenericSerialSlave I/O MappingのTabからIO Mappingを設定します。

Schneider Side

次はSchneider Sideです。

Connect It!

RJ45のCableはSchneider TM221のSL1 Portに接続します。

SL1?

そのSL1 RJ45 PortのPin 配列は以下になります。

PinRS232RS485
1RxDN.C.
2TxDN.C
3RTSN.C
4N.C.D1
5N.C.D0
6CTSN.C.
7N.C.*5 Vdc
8CommonCommon

Wire

色はこちらです。 

Basic

Configure SL1

まずはSL1の通信設定を行います。ConfigurationのTabを開き、SL1(Serial Line)をクリックします。

ProtocolをModbus選び>Physical mediumをRS485、Applyで設定をSaveします。

Configure Modbus Slave

次はSchneider TM221のModbus Slaveを設定します。SL1(Serial Line)>Modbusをクリックします。

DeviceをNoneにし>Tranmission ModeをRTU>AddressはSlaveで、AddressのFieldから自分のSlave Addressを設定すればOkです。

RevPi Connect 側のModbus RTU MasterはSlave 番号1と接続だと設定したので、ここでAddressも1にします。

Flow

こちらはSchneider側のFlowです。

Programming

Instruction memo – Comparison Block

今回でよく使用するのは比較命令です。BarsかComparison  Blockを選択します。

RungにDropします。

Comparision命令が追加されました。

Operation expressionのFieldからは比較の式を直接入力できます。

例えば%MW0 = %MW100なら、%MW0と%MW100の値が対等であればTrueになります。

Mappings

次はSchneider側で使用するMemory Devicesの一覧です。

Memory Bits
AddressSymbolDescription
%M0B_DEVICE_EQ1True=INPUTとOUTPUT値が同じ
%M1B_DEVICE_EQ2True=INPUTとOUTPUT値が同じ
%M2B_DUMMY
Memory Words
AddressSymbolDescription
%MW0INPUTREGISITER_0Modbus RTU 用のRegister、Schneider側の出力
%MW1INPUTREGISITER_1Modbus RTU 用のRegister、Schneider側の出力
%MW2INPUTREGISITER_2Modbus RTU 用のRegister、Schneider側の出力
%MW3INPUTREGISITER_3Modbus RTU 用のRegister、Schneider側の出力
%MW4INPUTREGISITER_4Modbus RTU 用のRegister、Schneider側の出力
%MW5INPUTREGISITER_5Modbus RTU 用のRegister、Schneider側の出力
%MW6INPUTREGISITER_6Modbus RTU 用のRegister、Schneider側の出力
%MW7INPUTREGISITER_7Modbus RTU 用のRegister、Schneider側の出力
%MW8INPUTREGISITER_8Modbus RTU 用のRegister、Schneider側の出力
%MW9INPUTREGISITER_9Modbus RTU 用のRegister、Schneider側の出力
%MW100MULTIREGISTER_0Modbus RTU 用のRegister、Schneider側の入力
%MW101MULTIREGISTER_1Modbus RTU 用のRegister、Schneider側の入力
%MW102MULTIREGISTER_2Modbus RTU 用のRegister、Schneider側の入力
%MW103MULTIREGISTER_3Modbus RTU 用のRegister、Schneider側の入力
%MW104MULTIREGISTER_4Modbus RTU 用のRegister、Schneider側の入力
%MW105MULTIREGISTER_5Modbus RTU 用のRegister、Schneider側の入力
%MW106MULTIREGISTER_6Modbus RTU 用のRegister、Schneider側の入力
%MW107MULTIREGISTER_7Modbus RTU 用のRegister、Schneider側の入力
%MW108MULTIREGISTER_8Modbus RTU 用のRegister、Schneider側の入力
%MW109MULTIREGISTER_9Modbus RTU 用のRegister、Schneider側の入力
%MW200IODATANOMATCHED_COUNTERInputとOutput不一致のCounter
%MW201IODATA_MATCHED_COUNTERInputとOutputが一致のCounter
%MW202REFLASHEDTIMER_SETTING更新Cycleの時間設定
Timer
%TM0REFLESHTIMER更新Timer

Master Task 1- New POU

こちらは実際のプログラムです。

Rung0

Reflash Timerの時間設定プログラムです。もし時間設定が0ならDefault値を入れます。

Rung1,Rung2

INPUTとOUTPUT データを比較します。

Rung3

INPUT DATAとOUTPUT DATAが一致するときや不一致するときにSetするFlagです。

Rung4

Outputデータを更新する。

Rung5

更新Timerです。

Bonus-1 Online Change

Memory WordなどのOnline変更するには直接Clickし、新しい与え入れEnterすればOkです。

 Bonus-2 Dec/Hex Display

DEC/HEXのDisplayから現在の表示Formatを10進数か16進数かを変更できます。

Bonus-3 Comment Display/Hide

こちらのボタンからCommentを表示・非表示できます。

Bonus-4 Symbol Display/Hide

こちらのボタンからSymbolを表示・非表示できます。

Result

こちらが結果です。まずRevPi Connect のModbus ObjectではxAllSlaveOKがTrueです。つまり接続が成功です。

そしてSchneider TM221のOutputとRevPIのInputにもRefleshし続けています。

最後、もし接続問題あればNOCHECKのCounterも加算しています。

こちらからもModuleの通信状態を確認できます。

Source Code

こちらからSource ProjectをDownloadできます。

https://github.com/soup01Threes/Codesys/blob/main/RevpiConnect_SchneiderTM221.7z

Footer_Basic

Please Support some devices for my blog

Amazon Gift List

Find ME

Twitter:@3threes2
Email:soup01threes*gmail.com (* to @)
YoutubeChannel:https://www.youtube.com/channel/UCQ3CHGAIXZAbeOC_9mjQiWQ

シェアする

  • このエントリーをはてなブックマークに追加

フォローする