1 / 19
文档名称:

MODBUS协议.docx

格式:docx   大小:30KB   页数:19页
下载后只包含 1 个 DOCX 格式的文档,没有任何的图纸或源代码,查看文件列表

如果您已付费下载过本站文档,您可以点这里二次下载

分享

预览

MODBUS协议.docx

上传人:w447750 2018/6/1 文件大小:30 KB

下载得到文件列表

MODBUS协议.docx

文档介绍

文档介绍:/*
* MODBUS协议
*
*
* 介绍:
* 此modbus上位机协议类具有较强的通用性
* 本协议类最主要的思想是把所有向下位机发送的指令先存放在缓冲区中(命名为管道)
* 再将管道中的指令逐个发送出去。
* 管道遵守FIFO的模式。管道中所存放指令的个数在全局变量中定义。
* 管道内主要分为两部分:1,定时循环发送指令。2,一次性发送指令。
* 定时循环发送指令:周期性间隔时间发送指令,一般针对“输入寄存器”或“输入线圈”等实时更新的变量。
* 这两部分的长度由用户所添加指令个数决定(所以自由性强)。
* 指令的最大发送次数,及管道中最大存放指令的个数在常量定义中可进行设定。
*
* 使用说明:
* 1,首先对所定义的寄存器或线圈进行分组定义,并定义首地址。
* 2,在MBDataTable数组中添加寄存器或线圈所对应的地址。注意寄存器:ob = new UInt16()。线圈:ob = new byte()。
* 3,对所定义的地址用属性进行定义以方便在类外进行访问及了解所对应地址的含义。
* 4,GetAddressValueLength函数中对使用说明的"第一步"分组的元素个数进行指定。
* 5,在主程序中调用MBConfig进行协议初始化(初始化内容参考函数)。
* 6,在串口中断函数中调用MBDataReceive()。
* 7,定时器调用MBRefresh()。(10ms以下)
* 指令发送间隔时间等于实时器乘以10。例:定时器5ms调用一次指令发送间隔为50ms。
* 8,在主程序初始化中添加固定实时发送的指令操作用MBAddRepeatCmd函数。
* 9,在主程序运行过程中根据需要添加单个的指令操作(非固定重复发送的指令)用MBAddCmd函数。
*
*
* 作者:王宏强
* 时间:
*
*
*
*
*
*
*/
using System;
using ;
using ponentModel;
using ;
using ;
using ;
using ;
using ;
namespace WindowsApplication1
{
public class Modbus
{
#region 所用结构体
/// <summary>
/// 地址对应表元素单元
/// </summary>
public struct OPTable{
public volatile int addr;
public volatile byte type;
public volatile object ob;
};
/// <summary>
/// 当前的指令
/// </summary>
public struct MBCmd
{
public volatile int addr; //指令首地址
public volatile int stat; //功能码
public volatile int len; //所操作的寄存器或线圈的个数
public volatile int res; //返回码的状态, 0:无返回,1:正确返回
};
/// <summary>
/// 当前操作的指令管道
/// </summary>
public struct MBSci
{
public volatile MBCmd[] cmd; //指令结构体
public volatile int index; //当前索引
public volatile int count; //当前功能码执行的次数
public volatile int maxRepeatCount; //最大发送次数
public volatile int rtCount; //实时读取的指令各数(无限间隔时间读取)
};
#endregion
#region 常量定义
public const byte MB_READ_COILS = 0x01; //读线圈寄存器
public const byte MB_READ_DISCRETE = 0x02; //读离散输入寄存器
public const byte MB_READ_HO