查询了很多资料,主要是通过物联网协议MQTT通讯实现。
一,实现外网控制的几种方式
1,西门子S7-1200或者1500系列PLC本身支持MQTT协议的

PLC连接外网的情况下,通过对应库做MQTT客户端连接到服务器,手机APP再连接MQTT服务器,实现数据交换,这个我摸索了好久,没摸索明白,就放弃了。
2,对于不支持MQTT协议的PLC可以通过物联网网关实现,购买一个有人或者巨控之类的网关,这个方式相对简单,手机端和云端APP都是厂家开发好的,缺点是价格贵些。
3,第三种方式就我用的方式,简单描述就是一台可以上网的电脑,一边连着PLC,一边做MQTT客户端,和手机APP连到通一个MQTT服务器进行通讯,如下图
手机APP使用MIT APP平台开发,上文有介绍,各位可以看看。
而我用云服务器代替了电脑,想练习的朋友不用云服务器,用普通电脑也行的,PLC连到了蒲公英路由器,通过蒲公英的异地组网功能实现云服务和PLC连接,如下图
云主机(随意一台电脑也行,一下用电脑代替),怎样接PLC的数据发送到手机呢?这里只要用到一个工具 Node-red,如下
它是完全免费的,可以一边读写PLC数据一边订阅和发布MQTT消息,等同于免费物联网网关。
二,简单程序编写
1,node-red和PLC通讯
node-red怎么安装各位自己搜索就好,或者找我要链接,这里不多讲啦,先讲Node-red怎么和PLC通讯,安装完毕后直接浏览器输入 HTTP://localhost:1880,或者127.0.0.1:1880进入编程界面,刚安装的是没有和西门子PLC通讯的插件的
如上图,设置进入控制板,然后搜索s7,添加S7的PLC的插件,安装完毕就有读取和输出的图标,拖出来用就行。
下面是配置PLC的通讯参数
需要读取的点
地址格式参考这个网站 https://www.mqtt.cn/1245.html
下面是写入PLC的数据,通讯参数和读取的一样
地址是一串字符串,处理方式和上文TCP局域网的处理一样。
发给PLC,PLC收到的数据是
输出为1的位置就表示对应的Q输出
2.node-red和MQTT服务器的通讯
MQTT服务器用的这个免费的
地址和端口设置好,主题设置为hyxhyx
这样,node-red就会将我需要的数据按周期发送到MQTT服务器,IOData就是对应Q的输出状态,1标识ON中,0标识OFF 中
下面是用MQTT客户端测试数据是否正常发出,如下图订阅的主题是hyxhyx,能正常收到数据
下图是订阅一个主题为"hyxhyx1'的消息,
是将手机APP发送的数据传到MQTT服务器,MQTT服务再给node-red,node-red将数据写入PLC的地址 DB99里面的0开始的地址,然后PLC处理数据
3,PLC和手机APP处理
上面大家也看明白了,node-red,MQTT服务器客户端,都是中转,为了让APP能和PLC能进行数据交换,下面简单介绍PLC数据处理。
PLC传输到APP
浮点数数据都是转字符的,开关也是字符表,0表示OFF中,1表示ON中
下面是PLC收到的数据,一大串字符,比如PT4101的压力是28.387
如下图,搜索整个字符串PT4101的位置,然后提取出来,
开关量数据一样
这是读取的PLC数据,
下面看看控制Q点开关如何编写
点击取反
所有内容合成一串
合成一串后以"hyxhyx1"主题发布
订阅主图hyxhyx1测试
PLC收到的内容
程序判断是字符1输出
以上是简单的控制,实际使用肯定需要加一些保护,比如心跳检测,APP是否和PLC通讯上等考虑。