本文以modbus通讯协议为例,详细讨论了一个人机系统中,如何 用c51实现单片机和plc之间通讯的实例。

modbus通讯协议

modbus协议是应用于电子控制器上的一种通用语言。通过此协议,控制器相互之间、控制器经由网络和其它设备之间可以通信。

modbus协议提供了主—从原则,即仅一设备(主设备)能初始化传输(查询)。其它设备(从设备)根据主设备查询提供的数据作出相应反应。主设备查询的格式:设备地址(或广播,此时不需要回应)、功能代码、所有要发送的数据、和一错误检测域。从设备回应消息包括确认地址、功能码、任何要返回的数据、和一 错误检测域。如果在消息接收过程中发生一错误,或从设备不能执行其命令,从设备将建立一错误消息并把它作为回应发送出去。

控制器能设置为两种传输模式:ascii和rtu,在同样的波特率下,rtu可比ascii方式传送更多的数据,所以采用ktu模式。

(1) 典型的rtu消息帧

典型的rtu消息帧如表1所示。

rtu消息帧的地址域包含8bit。可能的从设备地址是0...127(十进制)。其中地址0是用作广播地址,以使所有的从设备都能认识。主设备通过将要联络的从设备的地址放入消息中的地址域来选通从设备。当从设备发送回应消息时,它把自己的地址放入回应的地址域中,以便主设备知道是哪一个设备作出回应。

rtu消息帧中的功能代码域包含了8bits,当消息从主设备发往从设备时,功能代码域将告之从设备需要执行哪些行为;当从设备回应时,它使用功能代码域 来指示是正常回应(无误)还是有某种错误发生(称作异议回应,一般是将功能码的最高位由0改为1)。

从主设备发给从设备消息的数据域包含附加的信 息:从设备必须用于进行执行由功能代码所定义的行为。这包括了像不连续的寄存器地址,要处理项的数目,域中实际数据字节数。如果没有错误发生,从从设备返回的数据域包含请求的数据。如果有错误发生,此域包含一异议代码,主设备应用程序可以用来判断采取下一步行动。

当选用rtu模式作字符帧时,错误检测域包含一16bits值(用两个8位的字符来实现)。错误检测域的内容是通过对消息内容进行循环冗长检测(crc) 方法得出的。crc域附加在消息的最后,添加时先是低字节然后是高字节。

(2) 所有的modbus功能码

modbus的功能码定义如表2所示。

常用功能通讯程序的设计

本文介绍了几个modbus常用功能程序的设计。笔者采用单片机作为主机,在单片机上编写程序实现单片机与plc之间的通讯。由单片机向plc发出命令信 息,plc自动作出回应。plc通过单片机的串行通讯口通讯,程序用c51实现。程序的子函数及其功能:

(1) 串口初始化

void protocolinit(void)

函数功能:串口设置为异步通讯方式1(起始位1位,数据位8位,停止位1位);定时/计数器1设置为波特率发生器,通讯速率 9600bps;开串行中断,并把串行中断设置为高优先级。

(2) crc简单函数

unsigned char crc16(unsigned char *puchmsg, unsigned char usdatalen)

函数功能:先调入一值是全 “1”的16位寄存器,然后调用一过程将消息中连续的8位字节各当前寄存器中的值进行处理。每个8位字符都单独和寄存器内容相或(or),结果向最低有效 位方向移动,最高有效位以0填充。lsb被提取出来检测,如果lsb为1,寄存器单独和预置的值或一下,如果lsb为0,则不进行。整个过程要重复8次。在最后一位(第8位)完成后,下一个8位字节又单独和寄存器的当前值相或。最终寄存器中的值,是消息中所有的字节都执行之后的crc值。

(3) 初始化变量

void initvar(void)

函数功能:初始化所有过程变量。

(4) 串行中断服务程序

void protocolserialprocess(void) interrupt 4 using 2

函数功能:发送中断发送主机形成的命 令数组,发送完后置标志位;接收中断接收plc返回的响应数组,存入接收数组,并置标志位,且假设响应正确,留待主机处理。

(5) 读n个位变量(线圈)

void protocolread_bit(unsigned char deviceaddr/* plc局号*/, unsigned char regtype/*寄存器类型*/, unsigned int bitaddr/*起始地址*/, unsigned char subaddr/*子地址*/, unsigned int bitnum/*位数*/)

函数功能:根据函数参数,形成读n个位变量的 命令数组,启动发送。等待发送完并接收完(如超时未接收完则重新发送)。分析接收数组:正确,保存读取的数据;错误,重新发送。

(6) 写一个位变量

void protocolsetbit(unsigned char deviceaddr/* plc局号*/, unsigned char regtype/*寄存器类型*/, unsigned int bitaddr/*地址*/, unsigned char subaddr/*子地址*/, unsigned int clrset/*写值“1”或“0”*/)

函数功能:根据函数参数,形成 置某位变量为“1”或“0”的命令数组,启动发送。等待发送完并接收完(如超时未接收完则重新发送)。分析接收数组:正确,返回;错误,重新发 送。

(7) 读n个字节变量

void protocolreadbyte(unsigned char deviceaddr/* plc局号*/, unsigned char regtype/*寄存器类型*/, unsigned int regaddr/*起始地址*/, unsigned char subaddr/*子地址*/, unsigned int regnum/*个数*/)

函数功能:根据函数参数,形成读n个字节变量的命令数组,启动发送。等待发送完并接收完(如超时未接收完则重新发 送)。分析接收数组:正确,保存读取的数据;错误,重新发送。

(8) 写n个字节变量

void protocolsetbyte(unsigned char deviceaddr/* plc局号*/, unsigned char regtype/*寄存器类型*/, unsigned int regaddr/*起始地址*/, unsigned char subaddr/*子地址*/, unsigned int regnum/*个数*/)

函数功能:根据函数参数,形成写n个字变量的命令数组 (要写的数从某参数数组中读取),启动发送。等待发送完并接收完(如超时未接收完则重新发送)。分析接收数组:正确,返回;错误,重新发送。

以上的程序已经通过实验,并应用于实际的人机系统中。依照类似的方法,可以编写其他不同功能的程序,实现对plc的不同控制和操作。利用单片机和plc进 行优势互补,可以组成网络化、智能化的工业控制系统。另外整个单片机系统程序用c51语言编程,程序简洁,便于阅读与调试。单片机和人机界面结合可以实时 的显示plc的工作状况,实时的控制、设置、调整plc工作情况,提高工业控制的自动化程度和实时性。

c语言单片机与plc通讯,用c51实现单片机和plc之间通讯实例相关推荐

  1. 8051(c51)单片机从汇编到C语言,从Boot到应用实践教程

    8051(c51)单片机从汇编到C语言,从Boot到应用实践教程 作者 将狼才鲸 创建日期 2022-09-29 本仓库相关网址: CSDN文章地址 Gitee工程和源码地址 相关仓库: 嵌入式整体介 ...

  2. c51语言提供了code存储类型来访问,单片机原理与应用(C51编程+proteus仿真)第2版张毅刚--第3章课后习题答案2020年1月30日整理...

    单片机原理与应用(C51编程+proteus仿真)第2版 -张毅刚课后习题参考答案 第3章思考题及习题3 参考答案 一.填空 1.与汇编语言相比, C51语言具有().().().和()等优点.答:可 ...

  3. PLC和单片机有什么区别?什么是单片机?PLC又是什么意思?

    PLC和单片机有什么区别?什么是单片机?PLC又是什么意思? 什么是单片机? 单片机是一种集成电路芯片,是采用超大规模集成电路技术把具有数据处理能力的中央处理器CPU.随机存储器RAM.只读存储器RO ...

  4. 安川伺服总线通讯方式_plc通讯方式有哪三种?plc常见的三种通讯方式

    原标题:plc通讯方式有哪三种?plc常见的三种通讯方式 PLC = Programmable Logic Controller,可编程逻辑控制器,一种数字运算操作的电子系统,专为在工业环境应用而设计 ...

  5. PLC通讯实现-C#实现汇川PLC-AM401以太网通讯ModBus TCP

    PLC通讯实现-C#实现汇川PLC-AM401以太网通讯ModBus TCP 背景 抽象设计 汇川PLC-AM401以太网通讯实现Modbus TCP 测试效果 引用库下载 背景 本人近十年的工作都与 ...

  6. 川崎机器人总线通信_川崎机器人:PLC有那些功能?能实现机器人哪些通讯?

    川崎机器人:PLC有那些功能?能实现机器人哪些通讯? (一)运算功能 简单PLC的运算功能包括逻辑运算.计时和计数功能:普通PLC的运算功能还包括数据移位.比较等运算功能:较复杂运算功能有代数运算.数 ...

  7. C语言编程建议和技巧,同样适用于单片机的学习

    我们鼓励在编程时应有清晰的哲学思维,而不是给予硬性规则.我并不希望你们能认可所有的东西,因为它们只是观点,观点会随着时间的变化而变化.可是,如果不是直到现在把它们写在纸上,长久以来这些基于许多经验的观 ...

  8. 单片机c语言程序设计中可以不分大小写,论单片机课程教学中C语言编程的规范性...

    摘 要 文章针对"单片机C语言程序设计"教学中存在的编程困扰,提出在教学实践中重视引导学生进行模块化.规范性程序设计,强调规范化编程对学生理解程序的结构与功能的重要作用,并贯穿于课 ...

  9. 鸿蒙51单片机,基于C51系列单片机的交通控制系统设计

    2.2 数码时间显示电路 七段LED数码管是由八个发光二极管构成,通过给其引脚不同的高低电平,从而显出0~9的数字和小数点,本文通过四个一位数码管并联通过P3口当中的P3.0与P3.1与STATIC ...

最新文章

  1. PostgreSQL — 安装
  2. 《APUE》读书笔记—第十三章守护进程
  3. flipdim--按指定维数翻转矩阵
  4. 【数据竞赛】十大重要的时间组合特征!
  5. 安装 archlinux 之使用 EFI/GPT
  6. fastjson 过滤不需要的字段或者只要某些字段
  7. 改善Python程序的91个建议(二)
  8. Contiki 2.7 Makefile 文件(五)
  9. 数据库-MySQL-结果集-ASORDER BY
  10. video4linux(v4l)使用摄像头的实例基础教程与体会
  11. 删除字符,用外部函数
  12. fail to build phoneME Feature-转
  13. Oracle 视图、序列、索引、游标、触发器、事务
  14. 《Java语言程序设计与数据结构》编程练习答案(第十章)
  15. 一口气通过一系列阿里云证书ACA/ACP/ACE认证心得
  16. GRUB4DOS入门
  17. 一个年轻化品牌的自我修养:打造人格化流量
  18. BERT Word Embeddings 教程
  19. ROS学习----依据ROS入门教程,整理的ROS命令
  20. 最新Visual Studio的安装与使用 - 工作负荷选择 c语言 | 手把手基础教学

热门文章

  1. flask_萧井陌视频学习(二)
  2. 用C#实现控制台进度条
  3. 罗技鼠标m590 连接器无法工作
  4. 最小二乘法的几种拟合函数
  5. 青猴浏览器下载后会自动导入其他浏览器的书签?
  6. 数组 和 集合的区别 尤其是ArrayList
  7. bsod错误代码。_修复:安装Windows 7时HIDCLA​​SS.SYS中的蓝屏死机(BSOD)7E
  8. 关于用d3.js画力导向图(Force-directed Graph)—如何让图收放自如
  9. hexo更换next主题
  10. 海底捞涨价,我是捞不动了