三菱シーケンサー MCプロトコル ラズベリーパイとイーサネット通信
ネットワークパラメーター
このシステムにはMELSECNETとイーサネットモジュール(QJ71E71-100)が付いていてネットワークNo2
に割り付けてあります。
以下 GX-WORKS2で設定します。
CPUに付いているイーサネットを使う場合には、以下のページにわかりやすく解説されています。
PLCとRaspberry Piはとっても相性がいい。
https://qiita.com/Tatsuya-8888/items/28cc12dd637c0866fd1c
下記サンプルコードのパラメーター
サブヘッダ | subheader='5000' |
ネットワーク番号 | net='00' |
PC番号 | pc='FF' |
要求先ユニットIO番号 | unitio='03FF' |
要求先ユニット局番号 | unitno='00' |
要求データ長 | nlen='0018' |
CPU監視タイマー | cputimer='0010' |
コマンド | command='0401' |
サブコマンド | subcommand='0000' |
要求デバイス | device='D*000000' |
要求点数 | number='0002' |
IPアドレス ネットワークで決めておく | host='100.100.100.50' |
ポート番号 | port=5010 |
MCプロトコル |
MELSECコミュニケーションプロトコル |
リファレンスマニュアル 参照 |
#MELSEC_MCプロトコル PYTHON |
import socket |
class MySocket: |
def __init__(self, sock=None): |
print('init') |
if sock is None: |
self.sock = socket.socket( |
socket.AF_INET, socket.SOCK_STREAM) |
else: |
self.sock = sock |
def connect(self, host, port): |
print('connect') |
try: |
self.sock.connect((host, port)) |
return 0 |
except socket.error: |
print('コネクトエラーです') |
return -1 |
def close(self): |
print('CLOSE') |
try: |
self.sock.close() |
return 0 |
except socket.error: |
print('クロ-ズエラーです') |
return -1 |
def mysend(self, msg): |
print('mysend') |
try: |
self.sock.send(msg.encode('utf-8')) |
except: |
return -1 |
def myreceive(self): |
print('myreceive') data=[] |
try: |
data=(self.sock.recv(1024)) |
except: |
return -1 |
return data |
#----------------------------------------------------- |
def main(): |
#IPアドレス 100.100.100.50 |
#自局ポート番号 5010 |
host='100.100.100.50' |
port=5010 |
myapp = MySocket() |
connect_status=myapp.connect(host,port) |
#ワードの読み出し 16ビット符号有り D0 D1 |
if connect_status==0: |
subheader='5000' |
net='00' |
pc='FF' |
unitio='03FF' |
unitno='00' |
nlen='0018' |
cputimer='0010' |
command='0401' |
subcommand='0000' |
device='D*000000' |
number='0002' |
cmd=subheader+net+pc+unitio+unitno+nlen+cputimer+command+subcommand+device+number |
myapp.mysend(cmd) |
ret=[] |
count=2 |
ret=myapp.myreceive().decode('utf-8') |
datanum=[] |
anser=ret[18:22] |
if anser=='0000': |
for i in range(0,count): |
start=4*i+22 |
end=4*i+4+22 |
data=(int(ret[start:end],16)) |
if data>=32767: |
data=data-65536 |
datanum.append(data) |
print(str(datanum[i])) |
#ワードの読み出し 16ビット符号無し |
if connect_status==0: |
subheader='5000' |
net='00' |
pc='FF' |
unitio='03FF' |
unitno='00' |
nlen='0018' |
cputimer='0010' |
command='0401' |
subcommand='0000' |
device='D*000000' |
number='0002' |
cmd=subheader+net+pc+unitio+unitno+nlen+cputimer+command+subcommand+device+number |
myapp.mysend(cmd) |
ret=[] |
count=2 |
ret=myapp.myreceive().decode('utf-8') |
datanum=[] |
anser=ret[18:22] |
if anser=='0000': |
for i in range(0,count): |
start=4*i+22 |
end=4*i+4+22 |
data=(int(ret[start:end],16)) |
datanum.append(data) |
print(str(datanum[i])) |
#ワードの読み出し 32ビット符号無し D0 D1 |
if connect_status==0: |
subheader='5000' |
net='00' |
pc='FF' |
unitio='03FF' |
unitno='00' |
nlen='0018' |
cputimer='0010' |
command='0401' |
subcommand='0000' |
device='D*000000' |
number='0004' |
cmd=subheader+net+pc+unitio+unitno+nlen+cputimer+command+subcommand+device+number |
myapp.mysend(cmd) |
ret=[] |
count=2*2 |
ret=myapp.myreceive().decode('utf-8') |
datanum=[] |
anser=ret[18:22] |
if anser=='0000': |
for i in range(0,count,2): |
start=4*i+22 |
end=4*i+4+22 |
hstart=4*i+26 |
hend=4*i+26+4 |
datalow=(int(ret[start:end],16)) |
datahigh=(int(ret[hstart:hend],16)) |
data=datahigh*65536+datalow |
datanum.append(data) |
print(str(data)) |
#ビットの読み出し M0-M3 |
if connect_status==0: |
subheader='5000' |
net='00' |
pc='FF' |
unitio='03FF' |
unitno='00' |
nlen='0018' |
cputimer='0010' |
command='0401' |
subcommand='0001' |
device='M*000000' |
number='0004' |
cmd=subheader+net+pc+unitio+unitno+nlen+cputimer+command+subcommand+device+number |
myapp.mysend(cmd) |
count=4 ret=[] |
ret=myapp.myreceive().decode('utf-8') |
datanum=[] |
anser=ret[18:22] |
if anser=='0000': |
for i in range(0,count): |
start=i+22 |
data=(int(ret[start],10)) |
datanum.append(data) |
print(str(data)) |
#ビットの書き込み M0=1 M1=1 M2=0 M3=1 |
if connect_status==0: |
subheader='5000' |
net='00' |
pc='FF' |
unitio='03FF' |
unitno='00' |
nlen='001C' |
cputimer='0010' |
command='1401' |
subcommand='0001' |
device='M*000000' |
number='0004' |
devicedata='1101' |
cmd=subheader+net+pc+unitio+unitno+nlen+cputimer+command+subcommand+device+number+devicedata |
myapp.mysend(cmd) ret=[] |
ret=myapp.myreceive().decode('utf-8') |
anser=ret[18:22] |
print(anser) |
#ワードの書き込み |
if connect_status==0: |
subheader='5000' |
net='00' |
pc='FF' |
unitio='03FF' |
unitno='00' |
nlen='001C' |
cputimer='0010' |
command='1401' |
subcommand='0000' |
device='D*000002' |
number='0001' |
#16進で入力 0010 |
devicedata='0010' |
cmd=subheader+net+pc+unitio+unitno+nlen+cputimer+command+subcommand+device+number+devicedata |
myapp.mysend(cmd) ret=[] |
ret=myapp.myreceive().decode('utf-8') |
anser=ret[18:22] |
print(anser) |
myapp.close() |
if __name__ == '__main__': |
main() |