今回の記事は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
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 様のホームページです。
どうぞよろしくお願いします。
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 配列は以下になります。
Pin | RS232 | RS485 |
1 | RxD | N.C. |
2 | TxD | N.C |
3 | RTS | N.C |
4 | N.C. | D1 |
5 | N.C. | D0 |
6 | CTS | N.C. |
7 | N.C.* | 5 Vdc |
8 | Common | Common |
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
Address | Symbol | Description |
%M0 | B_DEVICE_EQ1 | True=INPUTとOUTPUT値が同じ |
%M1 | B_DEVICE_EQ2 | True=INPUTとOUTPUT値が同じ |
%M2 | B_DUMMY |
Memory Words
Address | Symbol | Description |
%MW0 | INPUTREGISITER_0 | Modbus RTU 用のRegister、Schneider側の出力 |
%MW1 | INPUTREGISITER_1 | Modbus RTU 用のRegister、Schneider側の出力 |
%MW2 | INPUTREGISITER_2 | Modbus RTU 用のRegister、Schneider側の出力 |
%MW3 | INPUTREGISITER_3 | Modbus RTU 用のRegister、Schneider側の出力 |
%MW4 | INPUTREGISITER_4 | Modbus RTU 用のRegister、Schneider側の出力 |
%MW5 | INPUTREGISITER_5 | Modbus RTU 用のRegister、Schneider側の出力 |
%MW6 | INPUTREGISITER_6 | Modbus RTU 用のRegister、Schneider側の出力 |
%MW7 | INPUTREGISITER_7 | Modbus RTU 用のRegister、Schneider側の出力 |
%MW8 | INPUTREGISITER_8 | Modbus RTU 用のRegister、Schneider側の出力 |
%MW9 | INPUTREGISITER_9 | Modbus RTU 用のRegister、Schneider側の出力 |
%MW100 | MULTIREGISTER_0 | Modbus RTU 用のRegister、Schneider側の入力 |
%MW101 | MULTIREGISTER_1 | Modbus RTU 用のRegister、Schneider側の入力 |
%MW102 | MULTIREGISTER_2 | Modbus RTU 用のRegister、Schneider側の入力 |
%MW103 | MULTIREGISTER_3 | Modbus RTU 用のRegister、Schneider側の入力 |
%MW104 | MULTIREGISTER_4 | Modbus RTU 用のRegister、Schneider側の入力 |
%MW105 | MULTIREGISTER_5 | Modbus RTU 用のRegister、Schneider側の入力 |
%MW106 | MULTIREGISTER_6 | Modbus RTU 用のRegister、Schneider側の入力 |
%MW107 | MULTIREGISTER_7 | Modbus RTU 用のRegister、Schneider側の入力 |
%MW108 | MULTIREGISTER_8 | Modbus RTU 用のRegister、Schneider側の入力 |
%MW109 | MULTIREGISTER_9 | Modbus RTU 用のRegister、Schneider側の入力 |
%MW200 | IODATANOMATCHED_COUNTER | InputとOutput不一致のCounter |
%MW201 | IODATA_MATCHED_COUNTER | InputとOutputが一致のCounter |
%MW202 | REFLASHEDTIMER_SETTING | 更新Cycleの時間設定 |
Timer
%TM0 | REFLESHTIMER | 更新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