1、打开仿真工具,创建PLC,注意创建完成后不要关闭
注意,这个IP地址必须与西门子虚拟网卡的IP地址及虚拟机的网卡IP地址同一网段
2、打开博途V15,创建项目,命名为Lan项目
3、添加1500系列CPU1513
4、设置设置IP地址及属性
5、添加通信模块MB_SERVER
找到程序块main,找到右边的指令,找到通信,找到其它,拖到MB_SERVER到程序段1中
重点看mb_hold_reg和connect参数,disconnet为false表示被动连接,意思是说服务器等待客户机来连接,而不是服务器主动连接客户机,也就是说要客户机主动来连接服务器,到时候客户机通过IP地址和端口来连接服务器,所以连接服务器肯定要通过CONNECT这个引脚,连接成功后客户机需要数据,就需要MB_HOLD_REG引脚来回复数据。
现在这里是???,先别管,保存项目,继续下面的,因为还没有设置好其他
6、添加一个全局数据块DB2,创建一个数据类型为TCON_IP_v4的变量,用于匹配CONNECT
图中各引脚定义:
其中id和localport可以自己定,但那个interfaceid是64,这个不能随便改,因为读取设备有个ID号,这个参数是隐含的,也要确保与设备保持一致,如图
至于那个remoteport是表示哪些外部的IP可以连接本服务器,默认情况下是全部的IP,一般不要修改,除非有特别要求,所以这里保持默认,即允许任何IP地址连接本服务器,至于ID可以理解为进程ID,范围是1-4095,不能为0,每个连接ID必须独立,本案例为1(修改起始值为1);
DB2编译一下,成功
7,添加一个全局数据块DB3,用于匹配功能块“MB_SERVER”的管脚参数“MB_HOLD_REG”
添加若干个变量,这里是8个,你可以根据实际情况
设置块属性
编译成功,可以看到变量的偏移量
8,设置MB_HOLD_REG引脚参数
MB_HOLD_REG就是保持寄存器的意思,在Modbus协议中就是03功能码
双击引脚,填写“P#DB3.DBX0.0 BYTE 20”,这里我重点讲下这个引脚是怎么配置,P表示指针的意思,DB3是因为上面第10步中,我添加的数据块名称是DB3,你要根据自己添加的数据块实际名称来改,然后0.0 BYTE 20表示从0到20个字节,为什么是20了,看下面图
word是一个字,占一个寄存器,占2个字节,real是两个字,占2个寄存器,占4个字节,因此第一个变量m1-speed的地址是0,1,8个变量的占的字节分别是:
m1-speed:0,1
m1-duaror:2,3
m1-level:4,5
m1-temp:6,7,8,9
m2-speed:10,11
m2-duaror:12,13
m2-level:14,15
m2-temp:16,17,18,19
从0到19共20个字节,字节就是用BYTE表示的啊,要明白这个意思,所以是0.0 BYTE 20,这里不能乱写,写错了就读不到变量的值,这里很多人容易搞错,要根据你的变量的字节范围来写,只能少,不能多,比如0.0 BYTE 22,就不对,因为没有22个字节,只有20个字节,不过,可以是0.0 BYTE 16,这就表示只读取前面7个变量,第8个变量不读取,除非你是这样的要求,当然后面可以添加很多个变量,
如上又添加了2个变量,字节范围24个字节(0---23),但是我的指针是P#DB3.DBX0.0 BYTE 20,就只会读取前面20个字节,即前面8个变量的值,后面的9,10变量不会读取,特别要理解这个地方,很多文章没有讲清楚,搞得一套糊涂,很多人也没有搞明白这里到底要怎么写。引脚MB_HOLD_REG的含义就是指向哪个数据块的哪个范围的字节来响应外部程序或设备的MODBUSTCP请求,这个字节范围只是少于等于,不能大于数据块的范围。
9,设置CONNECT引脚参数
这个引脚的含义就是指用哪个数据块来响应外部连接本服务器,因为MODBUSTCP连接时,需要指定服务器的IP地址及端口,如图
这个"tcp_connector".Connector,不就是指DB2数据块中的变量Connector吗?
前面第6步创建数据块2,创建变量Connector,就是起这个作用的,各位大佬,各位长佬,明白了不?
10、编译main程序块,成功
11,下载程序到PLC
12、针对DB3进行监控变量
13、小结
到此,PLC搭建成MODBUSTCP服务器完成,后面写C#程序,基本过程是:创建Plc,创建项目,设置设备IP地址,添加mb_server模块,添加2个数据块,数据块中添加变量,设置引脚参数,编译下载程序到PLC。
下载成功后,就意味着modbustcp服务器已经启动了,已经准备好等待客户机连接,读取保存寄存器的数据值了,不需要额外什么操作。