田螺 发表于 2019-12-15 21:27:47

Python与三菱PLC通信

本帖最后由 田螺 于 2020-2-15 09:51 编辑

## 上位机与三菱PLC通信

​                在市面上,触摸屏种类繁多。虽然编程方式都大同小异,但还是不能解决移植问题。python是一门跨平台的计算机程序设计语言,并且易读易维护。用python开发上位机,灵活性将会大大提高。



支持平台:

+ Windows
+ Linux
+ OSX



特点:

+ 输入\输出 点写
    + 输入/输出 位写入
    + 输入/输出 块写入
+ 输出点状态读取
    + 输出位读取
    + 输出块读取

+ 内部继电器读/写
    + 内部继电器位读写
    + 内部继电器块读写
+ 数据表读/写



## 准备工作

#### 所需库

```python
import serial        #串口通信
import re                #数据处理
```



#### 安装库

re模块是自带的无需下载,pyserial需额外安装。

`Win+R ——> CMD ——> pip install pyserial`

大家注意下时pyserial库不是serial库。。

![](http://ys-j.ys168.com/605061044/r7128543538LJOkybvnf/install%20serial.jpg)



#### ASCII码对照表

​                在翻译报文时,我们需要用到ASCII作为字典。为了方便查找这里我列出了常用的。

| 十六进制 |30|31|32|33|34|35|36|37|38|39|41|42|43|44|45|46|
| :------: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: | :--: |
|   字符   |0   |1   |2   |3   |4   |5   |6   |7   |8   |9   |A   |B   |C   |D   |E   |F   |



## 函数

#### SendMessage(发送报文)

​        1.功能

​                向PLC直接发送未经处理的报文,函数会自动计算并返回和校验

​        2.格式

​                lRet = SendMessage(iData)

​                        iData<class 'str'>                        Inout                        报文

​                        lRet<class 'bytes'>                  Output                和效验

​        3.示例代码

```python
>>> charm = SendMessage("02 37 30 30 30 35 03")
```



#### SetDevice(软元件设置)

​        1.功能

​                对单个软元件设置

​        2.格式

​                lRet = SetDevice(szDevice)

​                        iData<class 'str'>                        Inout                        触点

​                        lRet<class 'bytes'>                  Output                发送的报文

​        3.示例代码

```python
>>> cmd = SetDevice("Y0")                #Y0置位
>>> print(cmd)
'\x0270005\x03FF'

>>> cmd = SetDevice("y0")                #y0复位
>>> print(cmd)
'\x0280005\x0300'
```



#### ReadDeviceBlock(读取块)

​                这个函数需注意的是返回值,该函数返回的是一串16进制的数据。如果需要解释,我们提供了Translate()函数。

​        1.功能       

​                读取X点为lSize长度的数据

​                读取Y点为lSize长度的数据

​                读取数据表D为lSize长度的数据

​                返回为'bytes'类型的数据

​        2.格式

​                lRet = ReadDeviceBlock(szDevice,lSize)

​                        szDevice<class 'str'>               Inout                        触点 起始地址

​                        lSize<class 'int'>                                Inout                        读取长度

​                        lRet<class 'bytes'>                  Output               接收的报文

3.示例代码

```python
>>> response = ReadDeviceBlock("D0",2)                #从D0开始向后读取两字节数据
>>> print(response)

```



#### Translate(解释读取到的块)

​        1.功能

​                解释读取到的数据块,返回一个列表

​        2.格式

​                lRet= Translate(response)

​                        response<class 'bytes'>                Input                函数ReadDeviceBlock()返回值

​                        lRet <class 'list'>                                       Output        二进制方式保存的单个点位

​        3.示例代码

```python
>>>Translate(response)

```



#### WriteDeviceBlock(写入块)

​        1.功能

​                写入X点为iData的数据

​                写入Y点为iData的数据

​                写入数据表D为iData的数据

​        2.格式

​                WriteDeviceBlock(szDevice,iData)

PythonLV 发表于 2020-2-24 19:00:41

{:5_91:}

chaowei2008 发表于 2021-10-20 13:04:43

楼主牛逼,可惜我看不懂
页: [1]
查看完整版本: Python与三菱PLC通信