0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Modbus常用功能程序的设计

jf_78858299 来源:PLC无线通讯方案 作者:PLC无线通讯方案 2023-03-23 10:08 次阅读

HMI(人机界面)以其体积小,高性能,强实时等特点,越来越多的应用于工业自动化系统和设备中。它有字母、汉字、图形和图片等不同的显示,界面简单友好。配有长寿命的薄膜按钮键盘,操作简单。它一般采用具有集成度高、速度快、高可靠且价格低等优点的单片机[1]作为其核心控制器,以实现实时快速处理。PLC和单片机结合不仅可以提PLC的数据处理能力,还可以给用户带来友好简洁的界面。本文以Modbus通讯协议为例,详细讨论了一个人机系统中,如何用C51实现单片机和PLC之间通讯的实例。

2Modbus通讯协议[4]

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所示。

图片

3常用功能通讯程序的设计[5]

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

(1)串口初始化

voidProtocolInit(void)

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

(2)CRC简单函数

unsignedcharCrc16(unsignedchar*puchMsg,unsignedcharusDataLen)

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

(3)初始化变量

voidInitvar(void)

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

(4)串行中断服务程序

voidProtocolSerialProcess(void)interrupt4using2

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

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

voidProtocolRead_bit(unsignedcharDeviceAddr/ PLC局号 /,unsignedcharRegType/ 寄存器类型 /,unsignedintBitAddr/ 起始地址 /,unsignedcharSubAddr/ 子地址 /,unsignedintBitNum/ 位数 /)

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

(6)写一个位变量

voidProtocolSetBit(unsignedcharDeviceAddr/ PLC局号 /,unsignedcharRegType/ 寄存器类型 /,unsignedintBitAddr/ 地址 /,unsignedcharSubAddr/ 子地址 /,unsignedi

ntClrSet/ 写值“1”或“0” /)

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

(7)读N个字节变量

voidProtocolReadByte(unsignedcharDeviceAddr/ PLC局号 /,unsignedcharRegType/ 寄存器类型 /,unsignedintRegAddr/ 起始地址 /,unsignedcharSubAddr/ 子地址 /,unsignedintRegNum/ 个数 /)

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

(8)写N个字节变量

voidProtocolSetByte(unsignedcharDeviceAddr/ PLC局号 /,unsignedcharRegType/ 寄存器类型 /,unsignedintRegAddr/ 起始地址 /,unsignedcharSubAddr/ 子地址 /,unsignedintRegNum/ 个数 /)

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

4结束语

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

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 单片机
    +关注

    关注

    6001

    文章

    43973

    浏览量

    620854
  • plc
    plc
    +关注

    关注

    4975

    文章

    12255

    浏览量

    454919
  • MODBUS
    +关注

    关注

    27

    文章

    1438

    浏览量

    75692
  • 串行通讯
    +关注

    关注

    2

    文章

    77

    浏览量

    16261
收藏 人收藏

    评论

    相关推荐

    转:Keil的使用方法 - 常用功能(二)

    Ⅰ、概述 上一篇文章是总结关于Keil使用方法-常用功能(一),关于(文件和编译)工具栏每一个按钮的功能描述和快捷键的使用。我将每一篇Keil使用方法的文章都汇总在一起,回顾前面的总结请点击下面
    发表于 06-13 10:42

    allegro软件常用功能操作汇总

    allegro软件常用功能操作汇总文章部分截图:点击下载
    发表于 04-30 16:00

    Pads Router布线器常用功能应用技巧

    ;下面是对于其中的一些常用功能介绍:一、切线1.1、进入到pads router中,​按下F3,从焊盘拉出一条导线,【鼠标右键】–【启用切线模式】,如图1接着1.1步骤,用来平滑切除想要切断的导线
    发表于 09-20 09:05

    wavplayer是什么?wavplayer的常用功能有哪些

    for record:使能wav录音功能The record device name:指定录音使用的声卡设备,默认和播放一致,使用sound02、使用wavplayer 的常用功能已经导出到 Finsh
    发表于 07-12 14:17

    变频器的常用功能

    变频器的常用功能
    发表于 08-23 10:48 86次下载

    AltiumDesigner设计常用功能键大全

    Altium Designer 设计常用功能键大全
    发表于 07-03 15:19 0次下载

    Jenkins是什么_Jenkins常用功能_jenkins的使用总结

    本文详细回答了Jenkins是什么,Jenkins常用功能以及jenkins的使用总结。Jenkins 是一个可扩展的持续集成引擎。Jenkins其实就是一个工具,这个工具的作用就是调用各种其他的工具来达成你的目的。
    发表于 02-06 14:44 2.8w次阅读
    Jenkins是什么_Jenkins<b class='flag-5'>常用功能</b>_jenkins的使用总结

    modbus常用功能码解读

    Modbus具有两种串行传输模式,ASCII 和 RTU。它们定义了数据如何打包、解码的不同方式。支持 Modbus 协议的设备一般都支持 RTU 格式。通信双方必须同时支持上述模式中的一种。
    发表于 02-08 09:06 1.7w次阅读
    <b class='flag-5'>modbus</b><b class='flag-5'>常用功能</b>码解读

    allegro 软件常用功能

    allegro 软件常用功能操作汇总 1.在allegro中怎样移动元件的标识 edit--move,右边find面板只选text~~~ 2.allegro 查找元件的方法 按 F5 然后
    发表于 04-25 15:56 5863次阅读
    allegro 软件<b class='flag-5'>常用功能</b>

    fbd编程常用功能

    FBD是用功能块图去实现程序编制的一种编程语言,咬文嚼字的来说,它首先是功能块,然后是才是图,图表。意思就是说用很多的功能方块,组合起来,像一张图一样,这张图就实现了相关的
    的头像 发表于 12-28 10:40 1.6w次阅读
    fbd编程<b class='flag-5'>常用功能</b>

    Keil的使用方法 - 常用功能(二)

    Keil的使用方法 - 常用功能(二)
    的头像 发表于 04-07 14:55 2999次阅读
    Keil的使用方法 -  <b class='flag-5'>常用功能</b>(二)

    Keil的使用方法 - 常用功能(一)

    Keil的使用方法 - 常用功能(一)
    的头像 发表于 04-07 14:51 8195次阅读
    Keil的使用方法 -  <b class='flag-5'>常用功能</b>(一)

    allegro常用功能介绍

    allegro常用功能介绍
    发表于 01-10 11:53 0次下载

    Juniper防火墙几种常用功能的配置

    这里讲述的Juniper防火墙的几种常用功能主要是指基于策略的NAT的实现,包括:MIP、VIP和DIP,这三种常用功能主要应用于防火墙所保护服务器提供对外服务。
    的头像 发表于 04-03 10:52 2074次阅读

    变频器的常用功能

    地与生产机械的特性和要求相吻合,使变频调速系统运行在最佳状态。 一、变频器的常用功能 不同的变频器对功能码的编制方式不一样,但大致有两种类型:大模式型和功能码分区型。功能码分区型是将所
    的头像 发表于 09-20 16:00 778次阅读