MODULE modbusTCP_Master
!!!!!!! support holding register
!!!!!!! support holding coil
!!!!!!! support 0x03 0x06 0x10 0x01 0x05 0x0F function
VAR socketdev sock_mod;
VAR rawbytes recv_raw;
VAR rawbytes send_raw;
!!!!!! data need to be modified
PERS bool bBigEndian:=TRUE;
PERS string slave_ip:="127.0.0.1";
PERS num slave_ID:=1;
PERS num regAdd:=1;
VAR num outValue{50};
PROC main()
writeFloat2Reg 0,-0.98;
! 向寄存器地址0开始两个寄存器写入浮点数-0.98
reg1:=readFloatFromReg(0);
! 从寄存器地址0开始两个寄存器读取数据,并转化为浮点数
stop;
writeFloat2Reg 0,-0.98\bSiemens;
! 向西门子寄存器地址0开始两个寄存器写入浮点数-0.98
! 西门子modbus,高word在前,每个word内高低字节颠倒
reg1:=readFloatFromReg(0\bSiemens);
stop;
ENDPROC
PROC checkSocket()
if SocketGetStatus(sock_mod)<>SOCKET_CONNECTED THEN
SocketClose sock_mod;
SocketCreate sock_mod;
SocketConnect sock_mod,slave_ip,502\Time:=10;
endif
ENDPROC
func num readFloatFromReg(num regAdd\switch bSiemens)
! read float(4bytes) from 2 register, add1 with high word, add2 with low word
! funNo: 0x03: read multi holding register
! device send: 0000 0000 0006 01 03 0001 0001
! ttl data len slaveID funNo add data_num
! robot feedback: 0000 0000 0005 01 03 02 0001
! ttl data len slaveID funNo rest_data_len data
VAR num b{100}; VAR num dataByteLen;
VAR num w_high;
VAR num w_low;
VAR num outValue;
checkSocket;
b{1}:=0x00; b{2}:=0x00; b{3}:=0x00; b{4}:=0x00; b{5}:=0x00; b{6}:=0x06; b{7}:=slave_ID; b{8}:=0x03;
ClearRawBytes send_raw;
FOR i FROM 1 TO 8 DO
PackRawBytes b{i},send_raw,i\IntX:=1; ENDFOR
PackRawBytes regAdd,send_raw\Network,9\IntX:=2;
PackRawBytes 2,send_raw\Network,11\IntX:=2;
sendAndReceive;
UnPackRawBytes recv_raw\Network,9,dataByteLen\IntX:=UsINT;
IF present(bSiemens) THEN
UnPackRawBytes recv_raw\Network,10,w_high\IntX:=UINT;
UnPackRawBytes recv_raw\Network,12,w_low\IntX:=UINT;
PackRawBytes w_high,recv_raw,10\IntX:=2;
PackRawBytes w_low,recv_raw,12\IntX:=2;
ENDIF
UnPackRawBytes recv_raw\Network,10,outValue\Float4;
RETURN outValue;
ENDFUNC
PROC writeFloat2Reg(num regAdd,num data\Switch bSiemens)
! write float(4bytes) to 2 register,
! funNo: 0x10: write multi holding register
! device send: 0000 0000 000B FF 10 0002 0002 04 0021 002A
! ttl_data_len id funNo add data_num rest_data_len data1 data2
! robot feedback: 0000 0000 0006 FF 10 0002 00 02
! ttl_data_len id funNo add data_num
VAR num b{100}; VAR num v1;
VAR num v2;
VAR rawbytes out_raw;
VAR num dataByteLen;
checkSocket;
b{1}:=0x00; b{2}:=0x00; b{3}:=0x00; b{4}:=0x00; ! b{5}:=0x00; ! b{6}:=0x06; b{7}:=slave_ID; b{8}:=0x10;
ClearRawBytes send_raw;
FOR i FROM 1 TO 8 DO
PackRawBytes b{i},send_raw,i\IntX:=1; ENDFOR
PackRawBytes regAdd,send_raw\Network,9\IntX:=2;
PackRawBytes 2,send_raw\Network,11\IntX:=2;
PackRawBytes 2*2,send_raw\Network,13\IntX:=1;
PackRawBytes data,out_raw\Network,1\Float4;
IF Present(bSiemens) THEN
UnpackRawBytes out_raw\Network,1,v1\IntX:=2;
UnpackRawBytes out_raw\Network,3,v2\IntX:=2;
PackRawBytes v1,out_raw,1\IntX:=2;
PackRawBytes v2,out_raw,3\IntX:=2;
ENDIF
CopyRawBytes out_raw,1,send_raw,14;
PackRawBytes 7+2*2,send_raw\Network,5\IntX:=2;
sendAndReceive;
ENDPROC
ENDMODULE