物联网、万物互联不是很潮的一个概念嘛,看到了阿里云的物联网平台,在西门子这边也看到了MQTT Client库,就想着把 PLC 直接连接到阿里云的物联网平台,经过几天测试,终于成功
西门子的 mqtt client 库
发布消息
平台接收到消息
具体过程后续再慢慢发。
参考了三个文档,一个是阿里云的 通过MQTT.FX客户端连接阿里云物联网平台,一个是西门子LMQTT的手册,还有就是mqtt协议
使用MQTT.fx接入物联网平台
FB "LMQTT_Client" for SIMATIC S7-CPU
mqtt协议很早之前就下载打印好了的,链接就不发了,自己也容易找
上述测试是在PLCSIM ADVANCED上完成
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
帖子链接:http://www.ad.siemens.com.cn/club/bbs/post.aspx?a_id=1623906&b_id=66
搬把椅子,坐等下文
今天先发一下阿里云平台的设置
首先创建一个产品,我的就叫 S7-1500,品类选自定义,节点类型选直连设备,联网方式选以太网,数据格式选透传/自定义,认证方式选设备密钥。
我们的PLC几本书网关,也不是网关下的子设备,所以选直连设备
联网方式没啥好说的,通过CPU自带的网口出来,所以选以太网
数据格式选透传,如果选标准格式也不是不行,这样PLC组织数据的工作量会比较大,要把数组转换成字符串,然后以json格式发送出去,而这部分工作PLC又不是强项
认证方式选择 设备密钥,有三种方式,ID2需要购买,我测试就用不着了,X.509需要涉及到证书啥的,没研究过,之后再说
然后保存,产品就创建好了。
然后就是在产品之下添加一个设备
设备是属于产品的,如果之前创建了不止一个产品,添加设备的时候需要选择添加到哪个产品下面
我在S7-1500的产品下面添加了一个设备叫 PLC1
这就是我添加的设备
注意红圈中的内容,这是认证设备要用到的信息,阿里叫他 三元组,信息需要保密,特别是其中的 DeviceSecret,不能外泄,否则别人可以冒充你的设备联网了。
然后是Topic列表,之后我们订阅/发布消息需要用到,只能发布/订阅列表内的主题,我们测试只用其预定义好的就可以了
阿里云这边的设置基本就是这些了
终于上云了!学习
接下去就是连接测试了。
就像之前调试串口通讯一样,让我PLC和一个串口设备通讯,我会先用PC上的串口调试工具连接串口设备,根据通讯协议发送通讯指令,查看设备的响应情况,看看自己对协议的理解是否正确。
因为LMQTT client这个块我没有用过,到时候连吧不上,到底问题出在哪不好定位,到底是库的问题呢还是我的参数设置的问题呢,所以,我也找了一个,阿里云的文档示例用的是MQTT.FX,我用的是MQTTBOX,都差不多,设置的参数都是那几个。
我i把几个参数先列个表
broker address 服务器/代理 域名
broker port 服务器/代理 端口
clientid
username
password
除了端口号,TCP直连用的是1883外,其他几个参数都是和创建的设备的三元组相关的
broker address ${YourProductKey}.iot-as-mqtt.${region}.aliyuncs.com
Client ID ${clientId}|securemode=3,signmethod=hmacsha1|
username ${YourDeviceName}&${YourPrductKey}
password 这个比较麻烦,参考文档中有一个生成密码的小工具,通过那个工具生成,实际上还是和三元组相关,是根据三元组以及上面的一些信息做HMAC运算得到的。
上面的 ${} 是一个占位符,用实际的数值替换,比如三元组中的productkey,devicename等,其中的 ${region} 目前只有 cn-shanghai
这些参数之后用PLC连接平台都是需要用到的,先用PC上的MQTT client测试,看看能不能连上平台,如果可以,说明这些参数是正确的,如果不行,那就要查查看到底哪里出错了,特别是生成password的时候,多一个空格,或者大小写错误,生成的密码都是不一样的。
下面是我的mqttbox中client的设置
需要注意的是阿里云要求cleansession必须设置为1,keeplive时间不能设置过短,建议300s,否则会拒绝连接的
如果这里能连上平台,那么说明这些参数都没有问题了,接下去就可以进行PLC 编程了
连接上云,高大上
古人云和现在的云肯定是不一样的云他类似筋斗云
继续。
接下去就是1500的编程了
我没有1500CPU实体,所以测试是通过PLCSIM ADVANCED进行的。想要连接阿里云,就是要访问外网,那么PLCSIM ADVANCED的设置也是要有讲究的,online access 必须选择 virtual eth. adapter,然后下面是通过以太网而不是内部总线 local。切换online access 要没有实例在运行才可以。
接下去就是下载LMQTT库,地址在主贴中有,下载后在项目文件中打开库,把库程序拉的自己的块中进行调用。会自动添加一个FB和几个数据类型
很良心的是,这个FB是开源的,没有加密,可以自由修改。
数据类型中,第一个用于设置连接标志,第二个用于设置mqtt connect的参数,第三个是用于发布的,第四个是用于订阅的,第五个是用于接收订阅的数据的,第六个是用于设置tcp连接的属性的,比如服务器地址,端口号PLC用的哪个接口、连接ID等等
调用库
建一个数据块,保存用到的参数,除了第一个数据类型,其他的每个类型的建一个,因为第一个包含在了第二个中。
enable参数是一个bool类型,1连接服务器,0 断开连接
publishdata参数用于发布主题,subscribetoTopic用于订阅主题,这两个以后再说,测试连接的时候还用不上,tcpConnParam设置连接属性,mqttParam设置mqtt的连接属性,这两个参数要设置正确才能连接的上服务器
先说tcpConnParam
第一个参数 usdQdn,应该设置为1,因为我们要访问的是阿里云的服务器,只能通过域名访问,而不能通过ip地址
第二个参数hwidentifier,网口的设备标识符,新版本的cpu设置为0可以默认使用第一个网口,也可以在组态中查看指定端口的标识符,在这里填入,比如1511cpu上的网口的标识符就是64
connectionID。连接ID,这个做过西门子的网络通讯的都知道,每个连接唯一
qdnAddressBroker 这就是阿里云平台提供的地址,根据如下规则,由productkey和区域代码组成,
格式如下
{productkey}.iot-as-mqtt.cn-shanghai.aliyuncs.com,其中{productkey}用自己的productkey替代
因为使用qdn,所以ipAddressBroker不需要设置
localport 不需要设置,默认0就好了,client不需要指定端口号
mqttPort 设置为1883,mqtt TCP直连时使用的端口号
接下去4个参数不设置,用到安全连接的时候需要,目前只用TCP直连
接下去是mqttParam的参数设置
connectflag
根据阿里云的要求cleanSession必须设置为1,will和willRetain必须设置为0,忘了对connect的qos的要求了,也设置为0.因为连接阿里云是要登录的,所以将username和password设置为1
keepAlive 不能小于30,阿里推荐是300
clientidentifier 这个参数有一点点麻烦,根据mqtt协议,这个字段的长度是23个字节以下,但也允许超过这个长度,而阿里云的设置是远超过23字节的,而西门子的mqtt库设计的时候指定了数据类型是string[23],我们需要把这个给改了。因为这个是从库中拉出来的,需要更新库并重新发布才可以。这是我对库的第一处修改
willtopic和willmessage留空
username和password根据第一个参考连接生成。
总体框架搭好,就这样,就可以进行测试了
膜拜大神,请问咱连上云以后,都能做些什么呢?
连接“云”可以有不同的目的。
1、数据存储。这些数据可以由被授权的访问者远程访问。云存储的保管由专业服务器保存,不容易丢失。
2、有些大型分析软件,我们实际上买不起,但该软件利用率又不高。如果该软件是在云中运行(云计算),那么我们只需要提供现场数据(例如每小时/每天一次)就可以廉价使用软件,提高效益。
3、是可以通过VPN从远程连接内部局域网,但通常并不需要那么完全访问,单独开发移动APP访问也费用过高。这时利用云服务,是可以通过授权终端、手机APP访问云数据。
4、对于我们所用的控制器(PLC等)还可以做到 “云同步“;不同地点的生产线控制器协调工作,避免资源浪费。
厉害了,学习了
感谢分享。
学习了,这是以后得发展趋势啊!
引用8楼详细内容:
Y版紧跟时代步伐,真是我们后辈们学习的榜样。
下面继续
LMQTT库的使用碰到一个小坑,enable置为1,建立连接的时候,status一直报16#0000_8089错误,statusID 为2,查看库的源程序,statusID对应的是出现错误时 #statStateTcpMachine 的状态,而2对应的是TCP_CONNECTING,那就去查TCON的错误代码吧,8089对应的错误是 “参数 CONNECT 未指向连接描述,或者连接描述是手动创建的。” 或者是 “CONNECT 参数没有指向某个数据块。”
在库的静态变量中找类型为TCON的变量,找到了 “instTcpConnect”,然后搜索程序,程序中有两处 调用,代码是一样的,就是根据 #tcpConnParam.useQdn ,判断是使用域名还是使用IP地址,调用使用不同的参数调用instTcpConnect,我的程序是根据域名调用的,那我就在全局数据块中新建了一个TCON_QDN的变量,然后 instTcpConnect 之间用这个变量作为参数调用
把两处都这么修改。下载程序,再次测试,连接成功
再接下去就是测试发布消息了
先回到阿里云,看看当前设备的topic列表,有哪些是具有发布权限的topic,就在自定义topic中找了一个,复制topic名字,填到之前在全局数据块中建立的 "LMQTT_typePublishData" 类型的变量的 publishTopic 字段中,然后将要发布的topic内容填入到 publishMessageData 字段中,publishQoS 保持为0,publishRetainFlag也保持为false,阿里云不支持qos = 2,也不支持publishRetain。然后给 publishMessage一个上升沿,topic就发布出去了,回到阿里云,在日志中就可以看到刚刚发布的topic了。
订阅没有测试,能够发布,订阅应该也没有问题的。
后续计划:
1、目前阿里云的登录信息是通过阿里云提供的工具计算出来的,准备部分工作在PLC中完成,那样的话,只需要将三元组信息保存到PLC,PLC就可以自己计算出登录域名、用户名、密码和clientID。其他几项都简单,字符串拼接就可以了,密码需要用到HMAC-SHA1加密算法,这步其实已经完成,算法已经在PLCSIM中模拟测试完成,加载到这个程序中就可以了
2、将TCP直连改为TLS加密连接
楼主太厉害了,像楼主学习
收藏
点赞
1. 文件大小:上传文件的大小请限制在1M以内。
2. 文件格式:请不要上传.exe文件,系统支持的格式有:.jpg, .jpeg, .pdf, .gif, .zip, .rar, .doc,.docx, .xls,.xlsx, .ppt, .mp3, .wma, .wmv .asf, .avi, .bmp, .png, .txt, .7z
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!
用户登录
短信快捷登录
获取动态密码
七日内免验证登录 >忘记密码
立即注册登录
绑定第三方账号登录
扫描二维码登录支持中心移动端
短信登录
登录