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
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)、介绍如何实现数据的混合读取和写入;
在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);
}
这个DLL在Modbus的官方网站就有下载,不过有时间限制!
------------------------
西门子以太网模块CP243-1、CP343-1、443-1,不支持Modbus-TCP!
-----------------------------------------
矩形PLC,支持标准的Modbus-TCP(服务器/客户端)协议,最多可扩展7个本地模块
十分适合于做现场设备层的采集终端,做为子站通过以太网远程连接到西门子/施耐德/AB/GE等中大型PLC主站,与WINCC、组态王、iFix、力控等任意上位机组态软件无缝连接!
-------------------------------------
矩形科技N80系列PLC,内置了Modbus-TCP主从协议。