modbus tcp协议(modbus plus网络)通讯动态链接库DLLV2.0 全新更新 点击:8996 | 回复:9



wjun7610

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:14帖 | 199回
  • 年度积分:0
  • 历史总积分:436
  • 注册:2004年2月01日
发表于:2013-04-13 13:48:14
楼主

modbus_tcp.dll V2.0 modbus tcp协议(modbus plus网络)通讯动态链接库DLL(以下简称DLL), 

是为满足工业通信需要,针对工业领域要求上位机对PLC、工业仪表通讯实时采集与控制的 

组态编程而设计。 

本DLL是为标准Windows 32动态库通讯控件,具有以下特点: 

1)、遵循modbus tcp(modbus plus网络)协议; 

2)、支持多网络并发操作,支持多线程网络通讯; 

3)、实时性、可靠性好,通用性强; 

4)、适用于多PLC(下位机)联网和上位机通信,满足多方面的需要; 

5)、函数接口功能全,操作简单,支持modbus tcp主要通信功能码; 

6)、支持多达128个网络链接; 

7)、支持多种操作系统win2000/winXP等(标准Win32 DLL); 

8)、易于快速开发(VC等非RAD开发环境的开发); 

9)、可在多种编程环境下使用,例如VB、VC、Delphi、PB、Labview、易语言等开发环境; 

10)、扩展了读取下位机中的双字、单精度浮点等类型数据,更加符合工业自动化领域软件的开发。 

软件版本更新及相关说明: 

modbus_tcp.dll V2.0通讯链接库,实现了对保持寄存器40001~4XXXX区数据读写(FCN03:读、 FCN16:写; 

FCN06写单个数据);对逻辑线圈00001~0XXXX的读写(FCN01:读取一组线圈,FCN05:强置单线圈,FCN15强置多线圈); 

对输入状态10001~1XXXX的读(FCN02);对输入寄存器30001~3XXXX的读(FCN04)。 

对于16位整数和32位整数读取写入均按有符号整数处理,小数的返回按单精度浮点型(2进制浮点)处理读取方式。 

提供扩展功能函数,方便用户实现混合数据读取。能够同时满足128个网络链接的使用要求。 

modbus_tcp.dll V2.0 分为完美版和单机版两个版本。 

注意:实例在使用时不能超出试用版的地址限制,否则无法正确通讯。


龙帅工作室为您提供专业串口通讯控件,也可为您订制 

专用通讯协议串口控件。目前龙帅系列串口通讯协议 

控件包括modbus_rtu、modbus_tcp、三菱FX PLC编程口、 

欧姆龙HostLink、西门子PPI等多个系列产品。 

淘宝店:http://shop34821629.taobao.com

电  话:13912935690 

腾讯QQ:157610979 

邮  箱:157610979@QQ.com       
         
        chinawanglong@163.com

正在下载,请等待……
下载附件需0积分!




wjun7610

  • 精华:0帖
  • 求助:0帖
  • 帖子:14帖 | 199回
  • 年度积分:0
  • 历史总积分:436
  • 注册:2004年2月01日
发表于:2013-05-03 12:49:20
1楼

DLL网络端口操作函数包括:

  1)、mbtcpConnect启动网络连接;

  2)、mbtcpClose关闭网络连接;
       
  3)、mbtcpTrue判断网络连接端口是否打开; 
                    
  4)、mbtcpWork判断网络连接端口是否工作中; 
           
  5)、mbtcpSetDelay网络通讯延时设定;

modbus tcp协议标准功能码函数:

  1)、mbtcpfcn01  01功能码:取得一组逻辑线圈的当前状态(ON/OFF);

  2)、mbtcpfcn02  02功能码:取得一组开关输入的当前状态(ON/OFF);

  3)、mbtcpfcn03  03功能码:在一个或多个保持寄存器中取得当前16位整数值(字);  

  4)、mbtcpfcn04  04功能码:在一个或多个输入寄存器中取得当前16位整数值(字); 

  5)、mbtcpfcn05  05功能码:强置一个逻辑线圈的通断状态(ON/OFF);  

  6)、mbtcpfcn06  06功能码:把16位整数值(字)装入一个保持寄存器;

  7)、mbtcpfcn15  15功能码:强置一串连续逻辑线圈的通断状态(ON/OFF); 

  8)、mbtcpfcn16  16功能码:把16位整数值(字)装入一串连续保持寄存器; 

modbus tcp协议延伸功能码函数:

  1)、mbtcpfcn03DInt  03功能码 双字:在2个或多个保持寄存器中取得当前32位整数值(双字由2个寄存器组成);  

  2)、mbtcpfcn03Float 03功能码 浮点:在2个或多个保持寄存器中取得当前32位单精度浮点(浮点由2个寄存器组成);

  3)、mbtcpfcn04DInt  04功能码 双字:在2个或多个输入寄存器中取得当前32位整数值(双字由2个寄存器组成);  

  4)、mbtcpfcn04Float 04功能码 浮点:在2个或多个输入寄存器中取得当前32位单精度浮点(浮点由2个寄存器组成);  

  5)、mbtcpfcn16DInt  16功能码 双字:把32位整数值(双字由2个寄存器组成)装入2个或多个连续保持寄存器;   

  6)、mbtcpfcn16Float 16功能码 浮点:把32位位单精度浮点(浮点由2个寄存器组成)装入2个或多个连续保持寄存器;  

  7)、mbtcpWordBitWrite 03功能码延伸函数:给一个16位整数值的0-15的位地址赋值;  

  8)、mbtcpWordBitSetReset  03功能码延伸函数:将一个16位整数值的0-15的位地址强置通断一次;

modbus tcp协议DLL缓冲区传递功能函数包括:

  1)、mbtcpClearBuf  清除复位DLL缓存区;

  2)、mbtcpfcn01Buf  01功能码:取得一组逻辑线圈的当前状态(ON/OFF);  

  3)、mbtcpfcn02Buf  02功能码:取得一组开关输入的当前状态(ON/OFF);

  4)、mbtcpfcn03Buf  03功能码:在一个或多个保持寄存器中取得当前16位整数值(字); 

  5)、mbtcpfcn04Buf  04功能码:在一个或多个输入寄存器中取得当前16位整数值(字);

  6)、mbtcpfcn03DIntBuf  03功能码 双字:在2个或多个保持寄存器中取得当前32位整数值(双字由2个寄存器组成); 

  7)、mbtcpfcn04DIntBuf  04功能码 双字:在2个或多个输入寄存器中取得当前32位整数值(双字由2个寄存器组成);  

  8)、mbtcpIntDllBufRead  读DLL整数缓存区值;
  
  9)、mbtcpfcn03FloatBuf  03功能码 浮点:在2个或多个保持寄存器中取得当前32位单精度浮点(浮点由2个寄存器组成); 

10)、mbtcpfcn04FloatBuf  04功能码 浮点:在2个或多个输入寄存器中取得当前32位单精度浮点(浮点由2个寄存器组成);  

11)、mbtcpFloatDllBufRead  读DLL浮点缓存区值;

12)、mbtcpWriteIntDllBuf   写DLL整数缓存区值; 

13)、mbtcpfcn15Buf    15功能码:强置一串连续逻辑线圈的通断状态(ON/OFF); 

14)、mbtcpfcn16Buf    16功能码:把16位整数值(字)装入一串连续保持寄存器;  

15)、mbtcpfcn16DIntBuf   16功能码 双字:把32位整数值(双字由2个寄存器组成)装入2个或多个连续保持寄存器;

16)、mbtcpWriteFloatDllBuf  写DLL浮点缓存区值;  

17)、mbtcpfcn16FloatBuf  16功能码 浮点:把32位位单精度浮点(浮点由2个寄存器组成)装入2个或多个连续保持寄存器;

   这里,仅对PB开发环境使用DLL缓存区数据传递进行调用给出了

申明方式和调用举例,其他非VC、VB、Delphi等语言需要使用DLL

缓冲区进行数据传递时,调用DLL声明请参考本语言对Windows标准

DLL的规则和函数原型进行调用。

能够正确传递数组的开发环境如VB、VC、delphi不推荐使用该部分

扩展功能函数。

需要进行16位整数、32位整数、32位浮点数值进行混合读写时,所需拓展函数包括: 

  1)、DecBitBin  字整数的位抽取;

  2)、Int32ToInt_16h  双字到字转换高位字;  

  3)、Int32ToInt_16l  双字到字转换低位字;

  4)、Int16ToInt32  字到双字的转换; 

  5)、Float32ToInt_16h 浮点到字转换高位字; 

  6)、Float32ToInt_16l 浮点到字转换低位字;

  7)、Int16ToFloat32  字到浮点的转换;  

  8)、介绍如何实现数据的混合读取和写入;

 

wjun7610

  • 精华:0帖
  • 求助:0帖
  • 帖子:14帖 | 199回
  • 年度积分:0
  • 历史总积分:436
  • 注册:2004年2月01日
发表于:2013-05-03 12:49:44
2楼

在VC中使用DLL一般都是采用动态声明的方式,函数说明中给出的是Delphi的函数原型,

在VC中声明时只要注意一下类型的对应即可,Delphi中的longint类型对应VC中的int类型

Delphi中的Pchar对应VC中的char* ,下面给出主要函数的声明:

在使用的文件的cpp中声明一个句柄:

HINSTANCE hinstDLL;

用来标识导入的动态链接库。

1)、按下例说明声明相关各个函数:(在cpp文件的头处声明)

typedef int (_stdcall *pConnect)(int nport, int IpPort, char* IpAddress, char* User); 
typedef int (_stdcall *pClose)(int nport);
typedef int (_stdcall *pSetDelay)(int mtime, int num);
typedef int (_stdcall *pComTrue)(int nport);
typedef int (_stdcall *pComWork)(int nport);

typedef int (_stdcall *pfcn01)(int nport, int node, int address, int Count,int* RxdBuffer);
typedef int (_stdcall *pfcn02)(int nport, int node, int address, int Count,int* RxdBuffer);
typedef int (_stdcall *pfcn03)(int nport, int node, int address, int Count,int* RxdBuffer);
typedef int (_stdcall *pfcn04)(int nport, int node, int address, int Count,int* RxdBuffer);
typedef int (_stdcall *pfcn05)(int nport, int node, int address, int value);
typedef int (_stdcall *pfcn06)(int nport, int node, int address, int value);
typedef int (_stdcall *pfcn15)(int nport, int node, int address, int Count,int* TxdBuffer);
typedef int (_stdcall *pfcn16)(int nport, int node, int address, int Count,int* TxdBuffer);

typedef int (_stdcall *pfcn03DInt)(int nport, int node,  int regular, int address, int Count,int* RxdBuffer);
typedef int (_stdcall *pfcn03Float)(int nport, int node,  int regular, int address, int Count,float* RxdBuffer);
typedef int (_stdcall *pfcn04DInt)(int nport, int node,  int regular, int address, int Count,int* RxdBuffer);
typedef int (_stdcall *pfcn04Float)(int nport, int node,  int regular, int address, int Count,float* RxdBuffer);
typedef int (_stdcall *pfcn16DInt)(int nport, int node, int regular, int address, int Count,int* TxdBuffer);
typedef int (_stdcall *pfcn16Float)(int nport, int node, int regular, int address, int Count,float* TxdBuffer);
typedef int (_stdcall *pWbitWrite)(int nport, int node, int address, int Bit, int value);
typedef int (_stdcall *pWbitSetReset)(int nport, int node, int address, int Bit);

typedef int (_stdcall *pBitBin)(int value, int Bitaddress);
typedef int (_stdcall *p32I_16h)(int value);
typedef int (_stdcall *p32I_16l)(int value);
typedef int (_stdcall *p16I_32I)(int valueH, int valueL);
typedef int (_stdcall *p32f_16h)(float value);
typedef int (_stdcall *p32f_16l)(float value);
typedef float (_stdcall *p16I_32f)(int valueH, int valueL);

2)、建立动态链接库的新函数名:(在cpp文件的头处声明)

pConnect mConnect; 
pClose mClose;
pSetDelay mSetDelay;
pTrue mTrue;
pWork mWork;

pfcn01 mfcn01;
pfcn02 mfcn02;
pfcn03 mfcn03;
pfcn04 mfcn04;
pfcn05 mfcn05;
pfcn06 mfcn06;
pfcn15 mfcn15;
pfcn16 mfcn16;

pfcn03DInt mfcn03DInt;
pfcn03Float mfcn03Float;
pfcn04DInt mfcn04DInt;
pfcn04Float mfcn04Float;
pfcn16DInt mfcn16DInt;
pfcn16Float mfcn16Float;
pWbitWrite mWbitWrite;
pWbitSetReset mWbitSetReset;

pBitBin mBitBin;
p32I_16h m32I_16h;
p32I_16l m32I_16l;
p16I_32I m16I_32I;
p32f_16h m32f_16h;
p32f_16l m32f_16l;
p16I_32f m16I_32f;

3)、导入动态链接库,如例所示:(在cpp文件的OnInitDialog过程建立):

hinstDLL = LoadLibrary("modbus_tcp.dll");

4)、判断dll文件是否存在并声明并建立动态链接库中的函数与新函数名的对应关系,

如下:(在cpp文件的OnInitDialog过程建立):

if (hinstDLL)
{
   mConnect = (pConnect)GetProcAddress (hinstDLL,"mbtcpConnect");
   mClose = (pClose)GetProcAddress (hinstDLL,"mbtcpClose");
   mSetDelay = (pSetDelay)GetProcAddress (hinstDLL,"mbtcpSetDelay");
   mTrue = (pTrue)GetProcAddress (hinstDLL,"mbtcpTrue");
   mWork = (pWork)GetProcAddress (hinstDLL,"mbtcpWork");

   mfcn01 = (pfcn01)GetProcAddress (hinstDLL,"mbtcpfcn01");
   mfcn02 = (pfcn02)GetProcAddress (hinstDLL,"mbtcpfcn02");
   mfcn03 = (pfcn03)GetProcAddress (hinstDLL,"mbtcpfcn03");
   mfcn04 = (pfcn04)GetProcAddress (hinstDLL,"mbtcpfcn04");
   mfcn05 = (pfcn05)GetProcAddress (hinstDLL,"mbtcpfcn05");
   mfcn06 = (pfcn06)GetProcAddress (hinstDLL,"mbtcpfcn06");
   mfcn15 = (pfcn15)GetProcAddress (hinstDLL,"mbtcpfcn15");
   mfcn16 = (pfcn16)GetProcAddress (hinstDLL,"mbtcpfcn16");
    
   mfcn03DInt = (pfcn03DInt)GetProcAddress (hinstDLL,"mbtcpfcn03DInt");
   mfcn03Float = (pfcn03Float)GetProcAddress (hinstDLL,"mbtcpfcn03Float");
   mfcn04DInt = (pfcn04DInt)GetProcAddress (hinstDLL,"mbtcpfcn04DInt");
   mfcn04Float = (pfcn04Float)GetProcAddress (hinstDLL,"mbtcpfcn04Float");
   mfcn16DInt = (pfcn16DInt)GetProcAddress (hinstDLL,"mbtcpfcn16DInt");
   mfcn16Float = (pfcn16Float)GetProcAddress (hinstDLL,"mbtcpfcn16Float");
   mWbitWrite = (pWbitWrite)GetProcAddress (hinstDLL,"mbtcpWordBitWrite");
   mWbitSetReset = (pWbitSetReset)GetProcAddress (hinstDLL,"mbtcpWordBitSetReset");  

   mBitBin = (pBitBin)GetProcAddress (hinstDLL,"DecBitBin");
   m32I_16h = (p32I_16h)GetProcAddress (hinstDLL,"Int32ToInt_16h");
   m32I_16l = (p32I_16l)GetProcAddress (hinstDLL,"Int32ToInt_16l");
   m16I_32I= (p16I_32I)GetProcAddress (hinstDLL,"Int16ToInt32");
   m32f_16h = (p32f_16h)GetProcAddress (hinstDLL,"Float32ToInt_16h");
   m32f_16l = (p32f_16l)GetProcAddress (hinstDLL,"Float32ToInt_16l");
   m16I_32f= (p16I_32f)GetProcAddress (hinstDLL,"Int16ToFloat32");
  
   AfxMessageBox("modbus_tcp.dll已成功载入!");
}
else
{
  AfxMessageBox("没找到modbus_tcp.dll!");
  SendMessage(WM_CLOSE); 
}  

注:双引号中为动态链接库中的原有函数名。


函数中用到了char*型参数,这里介绍下char*与Cstring的相互转换的函数:

(1)char*->CString

char* sz;
CString str;
str.Format("%s",sz);  //可以用此函数将读取的值转成字符串

(2) CString -> char*

CString str;
char* sz = str.GetBuffer(0);//可将字符串转成char*给函数赋值


5)、当不再需要使用DLL时记得关闭串口及释放动态链接库,(在OnDestroy事件中释放)

if(hinstDLL)
{
   int k = mTrue(mnport);
   if (k==1) 
   {
      mClose(mnport);
   }    
   FreeLibrary(hinstDLL);
}

 

AutoCtrl888

  • 精华:0帖
  • 求助:0帖
  • 帖子:57帖 | 465回
  • 年度积分:48
  • 历史总积分:2394
  • 注册:2007年3月04日
发表于:2015-05-29 12:59:05
3楼

PLC以太网通讯的DLL(基于ModbusTCP),带例程,关键是支持双整形DINT和浮点数REAL:

下载地址: http://bbs.gongkong.com/d/201605/672164_1.shtml

rect_er

  • 精华:0帖
  • 求助:0帖
  • 帖子:17帖 | 185回
  • 年度积分:0
  • 历史总积分:283
  • 注册:2014年10月25日
发表于:2015-06-15 12:25:23
4楼

这个DLL在Modbus的官方网站就有下载,不过有时间限制!

------------------------

西门子以太网模块CP243-1、CP343-1、443-1,不支持Modbus-TCP!
-----------------------------------------
矩形PLC,支持标准的Modbus-TCP(服务器/客户端)协议,最多可扩展7个本地模块
十分适合于做现场设备层的采集终端,做为子站通过以太网远程连接到西门子/施耐德/AB/GE等中大型PLC主站,与WINCC、组态王、iFix、力控等任意上位机组态软件无缝连接!
-------------------------------------
矩形科技N80系列PLC,内置了Modbus-TCP主从协议。

fly120721

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 59回
  • 年度积分:0
  • 历史总积分:9
  • 注册:2014年2月19日
发表于:2015-06-21 21:42:39
5楼

谢谢!!!!!!!!!!!!!!1

AutoCtrl888

  • 精华:0帖
  • 求助:0帖
  • 帖子:57帖 | 465回
  • 年度积分:48
  • 历史总积分:2394
  • 注册:2007年3月04日
发表于:2016-05-09 20:06:01
6楼

直接下载可这个:

http://bbs.gongkong.com/d/201605/672164_1.shtml

ONET_dom

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:3
  • 注册:2014年9月01日
发表于:2017-02-14 13:42:45
7楼

有使用次数限制,是收费的吧。


热门招聘
相关主题

官方公众号

智造工程师