需求说明:
下位机是plc,西门子1200
下位机只能做服务器端,监听一个端口,不能主动给客户端发送消息(原计划是上位机也是监听一个端口,供下位机来访问,上传数据,结果现实很骨感)
上位机(pc)充当客户端,可以主动连接下位机交换信息
具体需求:
1,上位机给下位机下达工作数据
(比如下位机是生产纸张,上位机需要发给下位机纸张的尺寸,数量等数据)
2,下位机会在某个特定的时间“发送”数据,供上位机“接收”
(注意 “发送” 是加上引号的,因为服务器(下位机)是不能主动给客户端(上位机,pc)发送数据的,这是此文需要解决的问题)
需求1毫无难度,直接在用户在上位机点击下单,上位机即可创建一个socket将相关数据下传即可
重点来看看需求2;
可以想象为服务器与客户端(浏览器)
不妨以秒杀为例,
客户端(浏览器)提交秒杀请求(相当于这里的上位机给下位机下单),由于秒杀并发很大,不能实时返回数据(一般是异步下单,这里不深究)
客户端如果需要知道秒杀的结果,会在浏览器(客户端)通过轮询查询订单状态(如果有,则表示下单成功)
在需求2中,“客户端” 就指的是上位机创建的“socket”,socket是唯一和下位机沟通的途径,而且下位机不能创建socket,主动发数据给上位机,那么上位机创建得到socket,能否让他成为一个永久的客户端,上位机定时的取这个socket里的数据呢??
答案是肯定的:
思路:
将socket封装成一个单例,需求1和需求2中的客户端(上位机的socket) 使用同一个socket
问题又来了:
问题1:
如果上位机正在给下位机下传工作信息,下位机恰好也在此时完成了一些工作,将工作状态通过socket(由上位机创建的)发送数据ÿ