蒋 政
一、Python与PLC的通讯
二、Python的视觉处理
2.1摄像头画面的获取
2.2对画面的视觉处理
关键词:上位机、通讯、画面获取、画面处理
一、Python与PLC的通讯
Python可作为PLC上位机的一种,与PLC进行通讯连接。Python的使用通过PyCharm软件来实现。

在创建完文件后,我们便可以进行与PLC通讯,首先我们需要先下载一个叫做HslCommunication的软件包,具体操作为先打开终端,再输入代码pip install HslCommunication。

在下载完成后,我们创建一个python项目,需要导入我们下载的软件包。
这里我们使用了其中的两个类SiemensPLCS和 SiemensS7Net。
SiemensPLCS是用于定义西门子 PLC 的不同型号的一个类,SiemensS7Net借助 S7 协议实现与西门子 PLC 的通信。你可以用它来连接 PLC、读取和写入数据。做完这些工作后我们便进行通讯。
代码如上,创建一个 SiemensS7Net 对象 plc,指定要连接的 PLC 型号为 S200 Smart,并设置其 IP 地址为 192.168.0.88(此地址为PLC的地址)。调用 ConnectServer() 方法尝试连接到 PLC,该方法返回一个包含连接结果信息的对象,通过访问其 IsSuccess 属性判断连接是否成功,并将结果打印输出,如果连接成功,则会打印True,反之则是False。
ReadBool的作用便是读取PLC中布尔变量的值,WriteBool的作用就是对PLC中的布尔变量进行写入。同理可以用其他的Read和Write指令来进行其他数据类型数据的写入和读取。如图所示。


二、Python的视觉处理
2.1摄像头画面的获取
同与PLC的通讯一样,Python的视觉处理也需要下载额外的软件包进行辅助。这里需要下载cv2软件包。

下载完之后导入软件包,便可以进行我们对摄像头画面的获取了。
我们先用cv2.VideoCapture程序来定义摄像头设备,一般来说电脑自带的摄像头为第0号设备,这里使用的摄像头为外接摄像头,所以为第1号设备,因此编号为1。接下来就是camera.read指令,该指令会返回两个数据,第一个数据ret为结果判断值,若获取成功,则会返回Ture,反之则是False。而第二个返回值frame则是摄像头捕获的帧画面数据。Imshow指令为显示图片数据,其中参数的‘camera’为窗口的名字,waitKey指令为等待指令,在后面括号中填入1则是程序会等待1毫秒,这样在画面显示1毫秒后就会关闭,我们再通过while循环来重复执行,这样我们就获取了一个实时变化的摄像头画面。

我们也可以通过代码对摄像头的帧画面进行保存。
通过imread指令可以实现把frame突然以指定名称保存起来。

2.2对画面的视觉处理
我们以识别棋盘上的棋子为例。这里采用的方法是先进行形状检测,通过识别出图片里面的圆形,在根据色域区分出黑子和白子。
在圆形检测上,我们选用霍夫圆的检测函数:
HoughCircles(image, method, dp, minDist, circles=None, param1=None, param2=None, minRadius=None, maxRadius=None)
接下来对这个函数的各个参数进行解释,请看下面这张表。

那么清楚各个函数的作用之后,我们便可以根据实际情况进行调参,来识别出我们想要的圆。
为了方便后续操作,我们要对结果进行取整,避免小数的干扰:
如此一来,我们便得到了存有圆心坐标和圆半径的一个集合。接下来就是查看我们的效果。
我们使用循环遍历各个圆信息,根据得到信息在原图上进行绘画查看。
这里介绍下circle函数,是一个用于画圆的参数,其第一个参数img为画圆的图片,(i[0],i[1])为圆心的x与y坐标,i[2]为画圆的半径,(0,0,255)为画圆线的颜色,2为线的宽度。我们可以看下效果。

可以看到,所有的棋子都已被识别出来,接下来需要做到的是区分棋盘上的棋子和黑白棋子。我们需要确定棋盘在图片上的像素范围。

我们这边可以使用鼠标事件,绑定到窗口,这样我们便可以通过鼠标点击来获取图片上某个点的坐标。

这样我们便获取了棋盘的坐标范围。那么接下来我们便对黑白的颜色进行区分,这里我们先将图片转化成hsv图像,并通过代码获取某个特定点的hsv数值。
区别黑色和白色最明显的是v亮度,我们判断亮度在150以下的为黑子,大于的为白子。由此我们便可以把代码修改为:

我们将黑子用红圈圈出,白子用蓝圈圈出,效果展示:

这样我们就实现了我们的目标。