项目场景:

python与plc进行串口通信,寄存器写数据,适用于需要用串口通信的plc,如欧姆龙plc

问题描述:

python语言与plc建立串口通信时,无法直接读写。
用到python的serial 模块

在创建串口对象时需要定义其属性与plc一致:

         self.main_engine.baudrate = self.bpsself.main_engine.bytesize = 7self.main_engine.parity = 'E'self.main_engine.stopbits = 2

重点:在写入数据后,需要写16进制数"0D",结束标志位

     self.main_engine.write("@00WD1010000152*".encode())self.main_engine.write(binascii.a2b_hex("0D"))

解决方案:

import serial #导入模块
import serial.tools.list_ports
import time
import binascii
class myserial():def __init__(self, com, bps, timeout=0.5):   self.port = comself.bps = bpsself.timeout = timeoutglobal Rettry:# 打开串口,并得到串口对象#self.main_engine= serial.Serial(self.port,self.bps,timeout=self.timeout)self.main_engine= serial.Serial()self.main_engine.port = self.portself.main_engine.baudrate = self.bpsself.main_engine.bytesize = 7self.main_engine.parity = 'E'self.main_engine.stopbits = 2self.Open_Engine()# 判断是否打开成功if (self.main_engine.is_open):Ret = Trueexcept Exception as e:print("---异常---:", e)# 打印设备基本信息def Print_Name(self):print(self.main_engine.name) #设备名字print(self.main_engine.port)#读或者写端口print(self.main_engine.baudrate)#波特率print(self.main_engine.bytesize)#字节大小print(self.main_engine.parity)#校验位print(self.main_engine.stopbits)#停止位print(self.main_engine.timeout)#读超时设置print(self.main_engine.writeTimeout)#写超时print(self.main_engine.xonxoff)#软件流控print(self.main_engine.rtscts)#软件流控print(self.main_engine.dsrdtr)#硬件流控print(self.main_engine.interCharTimeout)#字符间隔超时#打开串口def Open_Engine(self):self.main_engine.open()#关闭串口def Close_Engine(self):self.main_engine.close()print(self.main_engine.is_open)  # 检验串口是否打开# 打印可用串口列表@staticmethoddef Print_Used_Com():port_list = list(serial.tools.list_ports.comports())print(port_list)if len(port_list) == 0:print('无可用串口')else:for i in range(0,len(port_list)):print(port_list[i])#接收指定大小的数据#从串口读size个字节。如果指定超时,则可能在超时后返回较少的字节;如果没有指定超时,则会一直等到收完指定的字节数。def Read_Size(self,size):return self.main_engine.read(size=size)#接收一行数据# 使用readline()时应该注意:打开串口时应该指定超时,否则如果串口没有收到新行,则会一直等待。# 如果没有超时,readline会报异常。def Read_Line(self):return self.main_engine.readline()#发数据def Send_data(self,data):self.main_engine.write(data)#更多示例# self.main_engine.write(chr(0x06).encode("utf-8"))  # 十六制发送一个数据# print(self.main_engine.read().hex())  #  # 十六进制的读取读一个字节# print(self.main_engine.read())#读一个字节# print(self.main_engine.read(10).decode("gbk"))#读十个字节# print(self.main_engine.readline().decode("gbk"))#读一行# print(self.main_engine.readlines())#读取多行,返回列表,必须匹配超时(timeout)使用# print(self.main_engine.in_waiting)#获取输入缓冲区的剩余字节数# print(self.main_engine.out_waiting)#获取输出缓冲区的字节数# print(self.main_engine.readall())#读取全部字符。#接收数据#一个整型数据占两个字节#一个字符占一个字节def Recive_data(self,way):# 循环接收数据,此为死循环,可用线程实现print("开始接收数据:")while True:try:# 一个字节一个字节的接收if self.main_engine.in_waiting:if(way == 0):for i in range(self.main_engine.in_waiting):print("接收ascii数据:"+str(self.Read_Size(1)))data1 = self.Read_Size(1).hex()#转为十六进制data2 = int(data1,16)#转为十进制print("收到数据十六进制:"+data1+"  收到数据十进制:"+str(data2))if(way == 1):#整体接收# data = self.main_engine.read(self.main_engine.in_waiting).decode("utf-8")#方式一data = self.main_engine.read_all()#方式二print("接收ascii数据:", data)except Exception as e:print("异常报错:",e)def send_ccd1_OK(self):# self.main_engine.write("@00WD1000000153*".encode())     self.main_engine.write("@00WD1000000250*".encode())     self.main_engine.write(binascii.a2b_hex("0D"))print("CCD1_OK")def send_ccd1_NG(self):self.main_engine.write("@00WD1000000153*".encode())self.main_engine.write(binascii.a2b_hex("0D"))print("CCD1_NG")def send_ccd2_OK(self):self.main_engine.write("@00WD1010000251*".encode())self.main_engine.write(binascii.a2b_hex("0D"))print("CCD2_OK")def send_ccd2_NG(self):self.main_engine.write("@00WD1010000152*".encode())self.main_engine.write(binascii.a2b_hex("0D"))#print(self.main_engine.write("@00WD1010000151*".encode()))print("CCD2_NG")def recv(self):while True:data = self.main_engine.read_all()if data == b'':continueelse:breaktime.sleep(0.02)return data
if __name__ == "__main__":myserial.Print_Used_Com()Ret =False #是否创建成功标志Engine1 = myserial("COM5",115200,0.5)if Engine1.main_engine.isOpen():print("open success")   if (Ret):Engine1.Print_Name()Engine1.send_ccd2_OK()data = Engine1.recv()print(data)data = Engine1.recv()print(data)

python与plc进行串口通信,寄存器写数据 欧姆龙plc相关推荐

  1. plc和pc串口通讯接线_PC与PLC的串口通信及编程实现

    35 PC 与 PLC 的串口通信及编程实现 黄植功 (广西师范大学物理与电子工程学院,广西  桂林  541004) 摘  要: 在自由口模式下,通信协议由用户自己的梯形图程序控制.用户可以使用梯形 ...

  2. C#解决串口通信中接收数据时延迟处理与缓存处理的方法

    转载连接: http://blog.csdn.net/yaoliang11/article/details/6885768 C#解决串口通信中接收数据时延迟处理与缓存处理的方法 时间:2011-1-2 ...

  3. [python] 3 、基于串口通信的嵌入式设备上位机自动测试程序框架(简陋框架)...

    星期一, 20. 八月 2018 01:53上午 - beautifulzzzz 1.前言 做类似zigbee.ble mesh...无线网络节点性能测试的时候,手动操作然后看表象往往很难找出真正的原 ...

  4. Python使用pyserial进行串口通信

    安装pyserial pip install pyserial 1 查看可用的端口 # coding:utf-8import serial.tools.list_portsplist = list(s ...

  5. 串口通信寄存器/库函数配置、实例编写

    常用的串口相关寄存器 USART_SR状态寄存器 USART_DR数据寄存器 USART_BRR波特率寄存器 串口操作相关库函数(省略入口参数): void USART_Init(); //串口初始化 ...

  6. FPGA自学笔记--串口通信发送多字节数据(verilog版)

    1.需求分析 关于uart协议实现这部分大家可以参考我上一篇的博客.<FPGA自学笔记--串口通信实现(vivado&verilog版)>.在上一篇博客中,主要实现了将单字节的数据 ...

  7. Android MCU之间的串口通信(收发数据)

    最近一个项目是android和MCU之间的串口指令数据通信,捣鼓了很久,也找了很多网上的资料.最后将实现的总结记录下来. 使用的是GitHub中的一个项目,下载地址:https://github.co ...

  8. 关于Proteus 8仿真STM32串口通信时显示数据错误或乱码问题解决!

    本人用Proteus 8仿真STM32F401RBT6串口通信时一直不能正确收发数据,写到板子通信数据显示正常,也在csdn查了很多人的解决办法,但都没了正常解决,直到看到某大神说到串口参数,我试着改 ...

  9. JAVA与下位机传感器进行DTU串口通信并将数据插入数据库

    最近在做一个物联网项目,需求是将传感器数据在无网络的环境下收集到服务器.思前想后,决定走DTU通信. 前提: 1.DTU相关配置请自行百度,本项目使用的是原子云4G DTU,需要准备4G物联网卡. 相 ...

  10. 欧姆龙PLC网关BL110之41:实现欧姆龙 PLC 接入Modbus TCP 云平台

    COM口采集欧姆龙 PLC CJ/CS/CP 的配置 欧姆龙PLC网关一共有四个COM 接口, 4个COM口的配置内容一样,COM1固定为RS232,COM2.COM3和COM4是RS232/RS48 ...

最新文章

  1. 飞书与德勤管理咨询达成战略合作,赋能企业实现智慧运营与管理
  2. 影像组学视频学习笔记(34)-使用3D Slicer软件提取影像组学特征、Li‘s have a solution and plan.
  3. 【实用】ABAP ALV单元格修改信息提示
  4. redis hash数据类型常用命令
  5. Python安装MySQL库详解(解决Microsoft Visual C++ 9.0 is required )
  6. python七段数码管倒计时_python实现七段数码管和倒计时效果
  7. 期望E==>加权均值(每个元素×它们各自的概率)
  8. Jupyter Lab——无法显示matplotlib绘制的图像
  9. weblogic 下载文件问题
  10. 整理一下N年前写的java web考勤管理系统
  11. 基于SSM的小区物业管理系统(附源码+论文)
  12. 银河奇异果/云视听企鹅/CIBN/芒果TV哪个好?四款电视视频软件对比评测
  13. 字体管理工具字由 v2.4.0.0 绿色便携版
  14. vue开发移动端app-学习记录
  15. VTN系列多通道振弦模拟信号采集仪常规操作
  16. unity 纹理压缩格式‘_游戏制作行业为什么使用TGA格式的贴图而不使用PNG格式?...
  17. Python练手项目:计算机自动还原魔方(2)还原顶部
  18. php配置站点报错403,phpstudy V8 报403错误怎么办
  19. pdf线条粗细设置_pdf线条很模糊怎么办 如何调整pdf线条粗细
  20. CentOs 7 中vim文本编辑器的下载及使用

热门文章

  1. itools苹果录屏大师_录屏可以有声音,发照片可以免流量,计算器输错可回删
  2. 花书《深度学习》代码实现:01 线性代数:基本概念+代码实现基本运算
  3. si4438使用stm32f103配置调试成功!
  4. java 常用前端框架_Java Web前端到后台常用框架介绍
  5. C语言面试基本点整理
  6. c语言源程序注释说明只能,C语言选择题
  7. C# 电子签章的实现
  8. C语言--16进制转字符串
  9. Java集合高频面试题(最新版)
  10. error: L6002U: Could not open file .\objects\startup_stm32f10x_hd.o