キーエンス KV5000 KV-LE21Vとラズベリーパイの
イーサネットMCプロトコル通信
KV-LE21V マニュアル参照
下記サンプルコードのパラメーター
サブヘッダ | 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='192.168.1.4' |
ポート番号 ユニットエディタで決めておく | port=5000 |
#KV5000MCプロトコル 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 mysend(self, msg): |
print('mysend') |
self.sock.send(msg.encode('utf-8')) |
def myreceive(self): |
print('myreceive') data=[] |
data=(self.sock.recv(1024)) |
# print(data) |
return data |
#----------------------------------------------------- |
def main(): |
host='192.168.1.4' |
port=5000 |
myapp = MySocket() |
connect_status=myapp.connect(host,port) |
#ワードの読み出し 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) |
count=2 ret=[] anser=[] |
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=[] anser=[] |
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ビット符号無し |
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=[] anser=[] |
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)) |
#ビットの読み出し |
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=[] anser=[] |
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)) |
if __name__ == '__main__': |
main() |