文章目录
- 前言
- 一、温湿度传感器
- 二、传感器与Smart200接线
- 三、PLC程序
- 四、读取数据
-
- 以16位整数形式读取数据
- 以32位浮点形式读取数据
- 五、参考文献
前言
正在学习西门子plc SMART200的Modbus通讯,手里正好有一块淘宝买的温湿度传感器,型号是SD123-T10,故拿来试试学习成果。
一、温湿度传感器
1、外观及引脚
2、默认通讯参数
查询随机资料,波特率:9600;无奇偶校验,8位数据位,停止位1位。
本次,我们分别用整型和浮点型从设备读取数据。
二、传感器与Smart200接线
1、西门子Port 0口
SMART200 的Port 0口可以支持Modbus RTU协议,作为Modbus主站,对传感器进行读写。这里,我们把PLC当作主站,传感器当作从站。
2、西门子 Port 0 口引脚
这里我们要注意下,温度传感器的3号引脚(RS485-A)对应西门子连接器3号端口(RS485-B),而温度传感器的4号引脚(RS485-B)却对应西门子连接器的8号端口(RS485-A)。
三、PLC程序
1、调用主站通讯
西门子在 STEP 7-Micro/WIN SMART 中正式推出 Modbus RTU 主站协议库,见下图:
这里有两组通讯库,一个Master,一个Master2,我这里用的是第一个,另外一个小伙伴们可以试试。
2、 MBUS_CTRL主站初始化和控制子程序引脚说明
根据上述引脚说明,MBUS_CTRL程序为:
3、主站读写子程序MBUS_MSG,引脚说明
根据上述引脚说明,MBUS_MSG程序为:
这里的几个参数要重点说下
- Slave是温湿度传感器的站号,也叫地址,从样本上可以查到。
- Addr是要读取参数的地址,在样本上也能查到,如16位温度地址40513。
- Count,是读取数据个数,比如,要同时读取16位的温度和湿度,你这里就给赋值2,如果只读一个参数,这里赋值就是1。也就是说,当Count=2时,系统从从40513开始,往下再多读取一个,读到40514停止。如果count是3,那么从40513开始,再读取40514和40515,以此类推。
- DataPtr 是读取数据指针,指针指向读取数据的地址。这里只能用字节,所以要读取实际数据,还得进行拼接。
四、读取数据
以16位整数形式读取数据
读取整形16位数据就按上述程序来即可,数据指针为&VB100,因为指针对应8位,所以需要2个8位字节组成一个自字来装载数据,也就是VW100是设备内温度的实际读取值,然后再除以10,得到实际温度值。
如果同时读取了湿度,也就是count参数为2是,那么湿度就是VW102,再除以10后,得到实际湿度值,读取值见下图:
根据上图,实际温度值为VW100/10=17°,实际湿度值VW102/10=35%
以32位浮点形式读取数据
根据设备样本,温度和湿度数值可以以浮点形式读取,那么程序要进行修改。
MBUS_CTRL 不需要修改。
MBUS_MSG 修改如下:
a)仅读取浮点温度
Addr :40516 count =2, 因为浮点32位,需要读取2个字的地址组成一个双字代表一个浮点。所以count=2. 其他不变。
b) 读取浮点温度和湿度
Addr :40516 count =4, 因为浮点32位,需要读取4个字的地址代表两个32位浮点。所以count=4. 其他不变。
重点:
当你用VD100和VD104 读取出数据的时候,你发现不对,见下图:
那是因为如果MODBUS tcp对方不是西门子设备时候,读上来的连续2个字要交换高低字。也就是说:
原来VD100=VW100+VW102,但是对方因为是非西门子产品,高地位要换位,即VD100=VW102+VW100。程序见下图:
五、参考文献
1、http://www.ad.siemens.com.cn/productportal/prods/s7-200-smart-portal/200smarttop/smartsms/020.html
2、https://zhuanlan.zhihu.com/p/161890397
3、http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1578456&b_id=64