三、DLL函數(shù)說(shuō)明
modbus.DLL是王俊于2007年最新開發(fā)的基于施耐得modbus rtu 通訊協(xié)議的串口通訊鏈接庫(kù)。modbus.DLL專業(yè)版實(shí)現(xiàn)了對(duì)保持寄存器40001~4XXXX區(qū)數(shù)據(jù)讀寫(FCN03:讀、FCN16:寫,F(xiàn)CN06寫單個(gè)數(shù)據(jù));對(duì)邏輯線圈00001~0XXXX的 讀寫(FCN01:讀取一組線圈,F(xiàn)CN05:強(qiáng)置單線圈,F(xiàn)CN15強(qiáng)置多線圈);對(duì)輸入狀態(tài)10001~1XXXX的讀(FCN02);對(duì)輸入寄存器30001~3XXXX的讀(FCN04)。
DLL中的主要函數(shù):
ComOpen:打開串口
ComClose:關(guān)閉串口
FCN01:讀取一組線圈(00001~0XXXX)
FCN02:取得一組開關(guān)輸入狀態(tài)數(shù)據(jù)(10001~1XXXX)
FCN03:讀多個(gè)保持寄存器數(shù)據(jù)(40001~4XXXX)
FCN04:讀多個(gè)輸入寄存器數(shù)據(jù)(30001~3XXXX)
FCN05S:置位單線圈(00001~0XXXX)
FCN05R:復(fù)位單線圈(00001~0XXXX)
FCN06: 預(yù)置單保持寄存器數(shù)據(jù)(40001~4XXXX)
FCN15: 強(qiáng)置多線圈的通斷數(shù)據(jù)(00001~0XXXX)
FCN16: 寫多個(gè)保持寄存器數(shù)據(jù)(40001~4XXXX)
FCN16_xSet:?jiǎn)伪3旨拇嫫鞯?~15相應(yīng)位的置位(40001.0-40001.15~4XXXX.0-4XXXX.15)
FCN16_xReset:?jiǎn)伪3旨拇嫫鞯?~15相應(yīng)位的復(fù)位(40001.0-40001.15~4XXXX.0-4XXXX.15)
FCN16_xSetReset:?jiǎn)伪3旨拇嫫鞯?~15相應(yīng)位的置復(fù)位(40001.0-40001.15~4XXXX.0-4XXXX.15),
指使相應(yīng)的位短時(shí)間通斷一次(約通60ms)
ComTrue:讀取DLL中的串口是否備有效打開
CinBin: 字中相應(yīng)的位的狀態(tài)抽取
1、打開串口
Function ComOpen(nport,BaudRate,DataBits,Parity,StopBits:longint;User:Pchar):longint;stdcall;
參數(shù):nport: 打開串口號(hào),取值為1~8,代表COM1~COM8;
BaudRate:波特率,取值為:1200、2400、4800、9600、19200、38400;
DataBits:數(shù)據(jù)位,取值為5、6、7、8;
Parity: 校驗(yàn)位,取值1(代表Even)、取值2(代表Odd)、取值3(代表Mark)、取值4(代表Space)、取值5(代表None);
StopBits:停止位,取值1(代表1位停止位)、取值2(代表2位停止位)、取值3(代表1.5位停止位);
User:DLL授權(quán)用戶名;
返回值:長(zhǎng)整型,操作成功返回“1”或“2”;1表示注冊(cè)授權(quán)用戶,2表示用戶未注冊(cè);
操作不成功返回為“0”時(shí)的原因:1)、串口不存在或被占用; 2)、DLL注冊(cè)授權(quán)不正確。
注:本DLL用戶不注冊(cè)除了下面說(shuō)明的功能限制外沒(méi)有其他限制,未注冊(cè)用戶請(qǐng)使用特定用戶名:wangjun。
注冊(cè)用戶功能上無(wú)任何限制,且將得到永久的軟件使用和更新升級(jí)服務(wù);
使用舉例:
Delphi:ComOpen(1,9600,8,1,1,Pchar('wangjun')) , 打開COM1口。
VB:ComOpen(1,9600,8,1,1,"wangjun") , 打開COM1口。(注:下面的示例都以VB調(diào)用形式給出)
2、關(guān)閉串口
Function ComClose(nport:longint):longint;stdcall;
參數(shù):nport: 串口號(hào),取值為1~8,代表COM1~COM8;
返回值:長(zhǎng)整型,操作成功返回“1”,否則返回“0”;
使用舉例:
ComClose(1) ,關(guān)閉打開的COM1口。
3、modbus相應(yīng)功能碼所對(duì)應(yīng)的讀取功能函數(shù)。
1)、01功能碼位元件的讀取(讀取一組線圈)
Function FCN01(nport,node,address,Count:longint):Pchar;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從00001~0XXXX地址區(qū)(邏輯線圈)值(你要讀標(biāo)準(zhǔn)modbus的00001地址這個(gè)值為0000,依次類推)
Count: 讀取的位元件個(gè)數(shù),一次最多讀取1000個(gè)但不能超出尋址范圍;
返回值: 16進(jìn)制字符串?dāng)?shù)據(jù),字符串?dāng)?shù)據(jù)的終止符為"@";
使用舉例:
FCN01(1,1,19,37),由COM1讀取modbus 1號(hào)從站00020~00056(標(biāo)準(zhǔn)modbus地址)的位狀態(tài)值,返回值為“CD6BB20E1B@”
則表示27~20:CD, 35~28:6B, 43~36:B2, 51~44:0E, 56~52:1B;
字節(jié)值與實(shí)際的位狀態(tài)值對(duì)應(yīng)參考(其他位功能函數(shù)的說(shuō)明不再重復(fù)本內(nèi)容):
位地址: | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | 35 | 34 | 33 | 32 | 31 | 30 | 29 | 28 |
-----------------------------------------
各位賦值: | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
-----------------------------------------
16進(jìn)制串: | C | D | 6 | B |
-----------------------------------------
不足8位的位組的狀態(tài)值參考:
位地址: | 56 | 55 | 54 | 53 | 52 |
-------------
各位賦值: | 0 | 1 | 0 | 1 | 1 |
-------------
16進(jìn)制串: | 1 | B |
-------------
在讀取錯(cuò)誤或不能讀取的情況下返回“Error@”
注:沒(méi)有注冊(cè)的用戶只能讀取00001~00006范圍的狀態(tài)值;
2)、02功能碼位元件的讀取(取得一組開關(guān)輸入狀態(tài)數(shù)據(jù))
Function FCN02(nport,node,address,Count:longint):Pchar;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從10001~1XXXX地址區(qū)(開關(guān)輸入狀態(tài))值(你要讀標(biāo)準(zhǔn)modbus的10001地址這個(gè)值為0000,依次類推)
Count: 讀取的位元件個(gè)數(shù),一次最多讀取1000個(gè)但不能超出尋址范圍;
返回值: 16進(jìn)制字符串?dāng)?shù)據(jù),字符串?dāng)?shù)據(jù)的終止符為"@";
使用舉例:
FCN02(1,1,196,22),由COM1讀取modbus 1號(hào)從站10197~10218(標(biāo)準(zhǔn)modbus地址)的位狀態(tài)值,返回值為“ACDB35@”
則表示10204~10197:AC, 10212~10205:DB, 10218~10213:35;
在讀取錯(cuò)誤或不能讀取的情況下返回“Error@”
注:沒(méi)有注冊(cè)的用戶只能讀取10001~10006范圍的狀態(tài)值;
3)、03功能碼字元件的讀取(讀多個(gè)保持寄存器數(shù)據(jù))
Function FCN03(nport,node,address,Count:longint):Pchar;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從40001~4XXXX地址區(qū)(保持寄存器數(shù)據(jù))值(你要讀標(biāo)準(zhǔn)modbus的40001地址這個(gè)值為0000,依次類推)
Count: 讀取的位元件個(gè)數(shù),一次最多讀取60個(gè)但不能超出尋址范圍;
返回值: 16進(jìn)制字符串?dāng)?shù)據(jù),字符串?dāng)?shù)據(jù)的終止符為"@";
使用舉例:
FCN03(1,1,107,3),由COM1讀取modbus 1號(hào)從站40108~40110(標(biāo)準(zhǔn)modbus地址)的字狀態(tài)值,返回值為“022B00000064@”
則表示40108:022B, 40109:0000, 40110:0064;
在讀取錯(cuò)誤或不能讀取的情況下返回“Error@”
注:沒(méi)有注冊(cè)的用戶只能讀取40001~40003范圍的狀態(tài)值;
4)、04功能碼字元件的讀取(讀多個(gè)輸入寄存器數(shù)據(jù))
Function FCN04(nport,node,address,Count:longint):Pchar;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從30001~3XXXX地址區(qū)(輸入寄存器數(shù)據(jù))值(你要讀標(biāo)準(zhǔn)modbus的30001地址這個(gè)值為0000,依次類推)
Count: 讀取的位元件個(gè)數(shù),一次最多讀取60個(gè)但不能超出尋址范圍;
返回值: 16進(jìn)制字符串?dāng)?shù)據(jù),字符串?dāng)?shù)據(jù)的終止符為"@";
使用舉例:
FCN04(1,17,8,1),由COM1讀取modbus 17號(hào)從站30009(標(biāo)準(zhǔn)modbus地址)的字狀態(tài)值,返回值為“000A@”
則表示30009:000A;
在讀取錯(cuò)誤或不能讀取的情況下返回“Error@”
注:沒(méi)有注冊(cè)的用戶只能讀取30001~30003范圍的狀態(tài)值;
4、modbus相應(yīng)功能碼所對(duì)應(yīng)的寫入功能函數(shù)
1)、05功能碼線圈的置復(fù)位功能函數(shù)
1、線圈置位
Function FCN05S(nport,node,address:longint):longint;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從00001~0XXXX地址區(qū)(邏輯線圈)值(你要寫標(biāo)準(zhǔn)modbus的00001地址這個(gè)值為0000,依次類推)
返回值: 長(zhǎng)整數(shù),操作成功返回1,不能寫入或操作錯(cuò)誤返回0;
使用舉例:
FCN05S(1,12,15),由COM1將modbus 12號(hào)從站00013(標(biāo)準(zhǔn)modbus地址)的位狀態(tài)值置1,返回值為1表示成功
注:沒(méi)有注冊(cè)的用戶只能寫入00001~00006范圍的狀態(tài)值;
2、線圈復(fù)位
Function FCN05R(nport,node,address:longint):longint;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從00001~0XXXX地址區(qū)(邏輯線圈)值(你要寫標(biāo)準(zhǔn)modbus的00001地址這個(gè)值為0000,依次類推)
返回值: 長(zhǎng)整數(shù),操作成功返回1,不能寫入或操作錯(cuò)誤返回0;
使用舉例:
FCN05R(1,12,15),由COM1將modbus 12號(hào)從站00013(標(biāo)準(zhǔn)modbus地址)的位狀態(tài)值置0,返回值為1表示成功
注:沒(méi)有注冊(cè)的用戶只能寫入00001~00006范圍的狀態(tài)值;
2)、06功能碼預(yù)置單保持寄存器數(shù)據(jù)功能函數(shù)
Function FCN06(nport,node,address:longint;Sendstr:pchar):longint;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從40001~4XXXX地址區(qū)(保持寄存器)值(你要寫標(biāo)準(zhǔn)modbus的40001地址這個(gè)值為0000,依次類推)
Sendstr: 寫入字值,該值為4個(gè)一組的16進(jìn)制字符串組成其取值為0000~FFFF(整數(shù)值為0~65535);
返回值: 長(zhǎng)整數(shù),操作成功返回1,不能寫入或操作錯(cuò)誤返回0;
當(dāng)要寫入字值時(shí)依次排列即可。如給40001寫值1000,先將1000轉(zhuǎn)成16進(jìn)制字符串03E8,則sendstr=03E8;
使用舉例:
FCN06(1,2,2,"03E8"),由COM1給modbus 2號(hào)從站40003(標(biāo)準(zhǔn)modbus地址)的字單元寫入1000(16進(jìn)制03E8),返回值為1表示成功
注:沒(méi)有注冊(cè)的用戶只能寫入40001~40003范圍的狀態(tài)值;
(00001~0XXXX)
3)、15功能碼強(qiáng)置多線圈的通斷數(shù)據(jù)功能函數(shù)
Function FCN15(nport,node,address,Count:longint;Sendstr:pchar):longint;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從00001~0XXXX地址區(qū)(邏輯線圈)值(你要寫標(biāo)準(zhǔn)modbus的00001地址這個(gè)值為0000,依次類推)
Count: 寫入位元件個(gè)數(shù),一次最多1000個(gè)但不能超出尋址范圍;
Sendstr: 給位元件寫入的值按8個(gè)為一組和成字節(jié)值在寫入,該值為2個(gè)一組的16進(jìn)制字符串組其取值為00~FF(整數(shù)值為0~255);
返回值: 長(zhǎng)整數(shù),操作成功返回1,不能寫入或操作錯(cuò)誤返回0;
---------- - ~ - ------
寫字符串序列如: | 00 | FF | 10 | 64 | ~ | 08 | 04 |
---------- - ~ - ------
實(shí)際字符串與位地址的數(shù)值應(yīng)如下表:
位地址: | 40 | 39 | 38 | 36 | 35 | 34 | 33 | 32 | 48 | 47 | 46 | 45 | 44 | 43 | 42 | 41 |
-----------------------------------------
各位賦值: | 0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 1 | 0 | 0 | 0 | 0 |
-----------------------------------------
16進(jìn)制串: | 6 | 4 | 5 | 0 |
-----------------------------------------
使用舉例:
FCN06(1,2,19,10,"CD01"),由COM1給modbus 2號(hào)從站00020~00029(標(biāo)準(zhǔn)modbus地址)10個(gè)位單元寫如相應(yīng)值,返回值為1表示成功
寫入值的參考 27~20:CD; 29~28:01;
位地址: | 27 | 26 | 25 | 24 | 23 | 22 | 21 | 20 | -- | -- | -- | -- | -- | -- | 29 | 28 |
-----------------------------------------
各位賦值: | 1 | 1 | 0 | 0 | 1 | 1 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 |
-----------------------------------------
16進(jìn)制串: | C | D | 0 | 1 |
-----------------------------------------
注:沒(méi)有注冊(cè)的用戶只能寫入00001~00006范圍的狀態(tài)值;
4)、16功能碼寫多個(gè)保持寄存器數(shù)據(jù)功能函數(shù)
Function FCN16(nport,node,address,Count:longint;Sendstr:pchar):longint;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從40001~4XXXX地址區(qū)(保持寄存器)值(你要寫標(biāo)準(zhǔn)modbus的40001地址這個(gè)值為0000,依次類推)
Count: 寫入字元件個(gè)數(shù),一次最多60個(gè)但不能超出尋址范圍;
Sendstr: 給字寫入的值,該值為4個(gè)一組的16進(jìn)制字符串組其取值為0000~FFFF(整數(shù)值為0~65535);
返回值: 長(zhǎng)整數(shù),操作成功返回1,不能寫入或操作錯(cuò)誤返回0;
當(dāng)要寫入多個(gè)字值時(shí)依次排列即可。如給40001與40002寫值100和1000,先將100轉(zhuǎn)成16進(jìn)制字符串0064、1000轉(zhuǎn)成16進(jìn)制字符串03E8,
則sendstr=006403E8;一次最多寫64個(gè)字即字符串長(zhǎng)應(yīng)小于等于256;
---------- ---- ~ ---------
寫字符串序列如: | 0064 | 03E8 | 0010 | 6004 | ~ | 0008 | 0400 |
---------- ---- ~ ---------
使用舉例:
FCN16(1,2,1,"000A0102"),由COM1給modbus 2號(hào)從站40002(標(biāo)準(zhǔn)modbus地址)的字單元寫入給10(16進(jìn)制000A)、40003(標(biāo)準(zhǔn)modbus地址)
的字單元寫入給258(16進(jìn)制0102)返回值為1表示成功;
注:沒(méi)有注冊(cè)的用戶只能寫入40001~40003范圍的狀態(tài)值;
5)、modbus功能碼16的擴(kuò)展功能函數(shù)
1、單保持寄存器的0~15相應(yīng)位的置位 (40001.0-40001.15~4XXXX.0-4XXXX.15)
Function FCN16_xSet(nport,node,address,Bit:longint):longint;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從40001~4XXXX地址區(qū)(保持寄存器)值(你要寫標(biāo)準(zhǔn)modbus的40001地址這個(gè)值為4000,依次類推)
Bit: 保持寄存器的位,取值0~15;
返回值: 長(zhǎng)整數(shù),操作成功返回1,不能寫入或操作錯(cuò)誤返回0;
使用舉例:
FCN16_xSet(1,12,2,0),由COM1將modbus 12號(hào)從站40003(標(biāo)準(zhǔn)modbus地址)的第0個(gè)位狀態(tài)值置1,返回值為1表示成功
注:沒(méi)有注冊(cè)的用戶不能使用本功能;
2、單保持寄存器的0~15相應(yīng)位的復(fù)位 (40001.0-40001.15~4XXXX.0-4XXXX.15)
Function FCN16_xReset(nport,node,address,Bit:longint):longint;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從40001~4XXXX地址區(qū)(保持寄存器)值(你要寫標(biāo)準(zhǔn)modbus的40001地址這個(gè)值為4000,依次類推)
Bit: 保持寄存器的位,取值0~15;
返回值: 長(zhǎng)整數(shù),操作成功返回1,不能寫入或操作錯(cuò)誤返回0;
使用舉例:
FCN16_xReset(1,10,3,12),由COM1將modbus 10號(hào)從站40004(標(biāo)準(zhǔn)modbus地址)的第12個(gè)位狀態(tài)值置0,返回值為1表示成功
注:沒(méi)有注冊(cè)的用戶不能使用本功能;
3、單保持寄存器的0~15相應(yīng)位的置復(fù)位 (40001.0-40001.15~4XXXX.0-4XXXX.15)指使相應(yīng)的位短時(shí)間通斷一次(接通約60ms)
Function FCN16_xSetReset(nport,node,address,Bit:longint):longint;stdcall;
參數(shù):
nport: 串口號(hào),取值為1~8,代表COM1~COM8;
node: modbus從站號(hào),取值1~255;
address: 元件地址,取值范圍從40001~4XXXX地址區(qū)(保持寄存器)值(你要寫標(biāo)準(zhǔn)modbus的40001地址這個(gè)值為4000,依次類推)
Bit: 保持寄存器的位,取值0~15;
返回值: 長(zhǎng)整數(shù),操作成功返回1,不能寫入或操作錯(cuò)誤返回0;
使用舉例:
FCN16_xSetReset(1,10,9,10),由COM1將modbus 10號(hào)從站40010(標(biāo)準(zhǔn)modbus地址)的第10個(gè)位狀態(tài)值置1后約60ms再置0,返回值為1表示成功
注:沒(méi)有注冊(cè)的用戶不能使用本功能;
四、DLL附加函數(shù)說(shuō)明 (本段函數(shù)對(duì)未注冊(cè)用戶沒(méi)有限制,完全可以使用。)
1、串口打開狀態(tài)的讀取
Function ComTrue(nport:longint):longint;stdcall;
參數(shù):
noprt: 串口號(hào),取值為1~8,代表COM1~COM8;
返回值:長(zhǎng)整型,串口成功打開返回“1”,否則返回“0”;
這里讀取是DLL有效取得了串口的控制權(quán),如果其他程序占用(串口不存在)等原因仍返回“0”。
2、整數(shù)轉(zhuǎn)換成16進(jìn)制字符串 (為VC等非RAD開發(fā)環(huán)境所增設(shè))
Function CIntToHex(Dcint,Digits:Longint):Pchar;stdcall;
參數(shù):
Cint: 待轉(zhuǎn)換整數(shù),取值為(0~65535);
Digits: 轉(zhuǎn)換的字符串位數(shù),指定位數(shù)小于實(shí)際位數(shù)時(shí)按實(shí)際輸出;
在參數(shù)錯(cuò)誤等非法的情況下返回“Error@”
使用舉例:
CIntToHex(200,2),則返回字符串“C8@”;
CIntToHex(200,4),則返回字符串“00C8@”;
CIntToHex(200,8),則返回字符串“000000C8@”;
CIntToHex(4500,4),則返回字符串“1194@”;
CIntToHex(4500,3),則返回字符串“1194@”,因?yàn)椤?94”不足以表示4500這個(gè)數(shù)所以按實(shí)際輸出字符串“1194@”;
"@"為字符串?dāng)?shù)據(jù)的終止符。
3、16進(jìn)制字符串轉(zhuǎn)換成整數(shù) (為VC等非RAD開發(fā)環(huán)境所增設(shè))
Function CHexToInt(CHex:Pchar):Longint;stdcall;
參數(shù):
CHex: 待轉(zhuǎn)換字符串,取值為(0000~FFFF);
使用舉例:
CHexToInt("03E8"),則返回整數(shù)1000;
注:在參數(shù)不正確等出錯(cuò)情況下返回值為“-1”。
4、抽取(0~65535)所示整數(shù)中(0~15)某個(gè)位的值
Function CinBin(CHex,Start:longint):longint;stdcall;
參數(shù):
CHex: 待轉(zhuǎn)換整數(shù),取值為0~65535(0000~FFFF);
Start: 抽取的位,取值為(0~15);
使用舉例:
CinBin(15,3),則返回值1;
CinBin(15,4),則返回值0;
CinBin(1000,6),則返回值1;
讀取MB0組合成的字節(jié)值為“FC”(252)時(shí),要讀取M0.1的值時(shí),則調(diào)用CinBin(252,1)返回值0表示M0.1的值為0。
注:在參數(shù)不正確等出錯(cuò)情況下返回值為“-1”。
5、返回字符串Text左邊的Count個(gè)字符 (為VC等非RAD開發(fā)環(huán)境所增設(shè))
Function CLeftStr(Text:Pchar;Count:longint):Pchar;stdcall;
參數(shù):
Text: 字符串原型;
Count: 指定返回左側(cè)字符串個(gè)數(shù);
在參數(shù)錯(cuò)誤等非法的情況下返回“Error@”
使用舉例:
CleftStr("123456", 3) = "123@";
"@"為字符串?dāng)?shù)據(jù)的終止符。
6、返回字符串Text右邊的Count個(gè)字符 (為VC等非RAD開發(fā)環(huán)境所增設(shè))
Function CRightStr(Text:Pchar;Count:longint):Pchar;stdcall;
參數(shù):
Text: 字符串原型;
Count: 指定返回右側(cè)字符串個(gè)數(shù)
在參數(shù)錯(cuò)誤等非法的情況下返回“Error@”
使用舉例:
CRightStr("123456", 3) = "456@";
"@"為字符串?dāng)?shù)據(jù)的終止符。
7、返回字符串Text從Start開始的Count個(gè)字符 (為VC等非RAD開發(fā)環(huán)境所增設(shè))
Function CMidStr(Text:Pchar;Start,Count:longint):Pchar;stdcall;
參數(shù):
Text: 字符串原型;
Start: 指定返回字符串的起始位置;
Count: 指定返回字符串個(gè)數(shù);
在參數(shù)錯(cuò)誤等非法的情況下返回“Error@”
使用舉例:
CMidStr("123456",2,3) = "234@";
"@"為字符串?dāng)?shù)據(jù)的終止符。
8、字符串Cstr開始于字符串Ostr的位置 (為VC等非RAD開發(fā)環(huán)境所增設(shè))
Function Cinstr(Ostr,Ckstr:Pchar;Dcint:Longint):Longint;stdcall;
參數(shù):
Ostr: 字符串原型;
Cstr: 查詢的字符串;
Dcint: 設(shè)定查詢字符串的起始位置,取值>=1,即最少?gòu)脑醋址牡谝粋(gè)字符開始查詢;
返回值:長(zhǎng)整型;
使用舉例:
CinStr("1Tfdg23456","2",2) = 6
注:在參數(shù)不正確等出錯(cuò)情況下返回值為“0”。
9、PC喇叭的報(bào)警過(guò)程函數(shù);
Function MyBeep(SoundHz:longint):longint;stdcall;
參數(shù):SoundHz:長(zhǎng)整型;
返回值:長(zhǎng)整型,操作成功返回“1”,否則返回“0”。
使用舉例:
MyBeep(2000); 按2000的頻率發(fā)出報(bào)警聲。
DLL中關(guān)于傳出字符串值的函數(shù)都以"@"為字符串函數(shù)值終止符,這是對(duì)多開發(fā)環(huán)境應(yīng)用時(shí)方便用戶正確讀取返回字符串?dāng)?shù)據(jù)而設(shè)。
五、Delphi、VB、VC語(yǔ)言環(huán)境的開發(fā)使用說(shuō)明
1、Delphi語(yǔ)言環(huán)境開發(fā)說(shuō)明
在Delphi環(huán)境下將modbus.dll、serialmodbus.slip(許可文件)復(fù)制到應(yīng)用程序目錄下(即將上述文件與編譯后的可執(zhí)行文件方入同一文件內(nèi));
在工程文件的主程序窗體(pas)文件中聲明:
Function ComOpen(nport,BaudRate,DataBits,Parity,StopBits:longint;User:Pchar):longint;stdcall;External'modbus.dll';
Function ComClose(nport:longint):longint;stdcall;External'modbus.dll';
Function FCN01(nport,node,address,Count:longint):Pchar;stdcall;External'modbus.dll';
Function FCN02(nport,node,address,Count:longint):Pchar;stdcall;External'modbus.dll';
Function FCN03(nport,node,address,Count:longint):Pchar;stdcall;External'modbus.dll';
Function FCN04(nport,node,address,Count:longint):Pchar;stdcall;External'modbus.dll';
Function FCN05S(nport,node,address:longint):longint;stdcall;External'modbus.dll';
Function FCN05R(nport,node,address:longint):longint;stdcall;External'modbus.dll';
Function FCN06(nport,node,address:longint;Sendstr:pchar):longint;stdcall;External'modbus.dll';
Function FCN15(nport,node,address,Count:longint;Sendstr:pchar):longint;stdcall;External'modbus.dll';
Function FCN16(nport,node,address,Count:longint;Sendstr:pchar):longint;stdcall;External'modbus.dll';
Function FCN16_xSet(nport,node,address,Bit:longint):longint;stdcall;External'modbus.dll';
Function FCN16_xReset(nport,node,address,Bit:longint):longint;stdcall;External'modbus.dll';
Function FCN16_xSetReset(nport,node,address,Bit:longint):longint;stdcall;External'modbus.dll';
Function ComTrue(nport:longint):longint;stdcall;External'modbus.dll';
Function MyBeep(SoundHz:longint):longint;stdcall;External'modbus.dll';
其它附加函數(shù)Delphi有實(shí)用函數(shù),建議用Delphi自帶函數(shù),如需使用聲明參照上例;
注:所有DLL的函數(shù)必須聲明方能使用,建議本DLL的聲明采用示例所示的靜態(tài)聲明方式。 聲明后可以在程序中使用這些函數(shù),附加函數(shù)
中除ComTrue、CinBin、MyBeep等Delphi系統(tǒng)自帶有類似功能函數(shù)。通信時(shí)必須先使用ComOpen函數(shù)打開串口,在串口打開后可以有效操作
相關(guān)函數(shù),為確保通信可在程序運(yùn)行開始時(shí)打開串口,程序退出前關(guān)閉串口。應(yīng)用程序退出之前請(qǐng)務(wù)必將關(guān)閉所有串口,如串口沒(méi)有關(guān)閉
而退出程序?qū)伋霎惓ee(cuò)誤。
確保應(yīng)用程序在關(guān)閉釋放前關(guān)閉打開的串口。解決方法,在form的OnDestroy事件中加入如下語(yǔ)句:
for i:=1 to 8 do
begin
if ComTrue(i)=1 then ComClose(i);
end;
在Delphi中給中給DLL中的函數(shù)傳pchar值問(wèn)題,建議string型轉(zhuǎn)換到Pchar型采用strPCopy()函數(shù),Pchar型轉(zhuǎn)換到string型采用straps()函數(shù),
不推薦使用直接轉(zhuǎn)換法即string到Pchar類型采用Mpchar=Pchar(str),Pchar到string采用str:=Mpchar (str為string類型、Mpchar為Pchar
類型)。上述可以詳細(xì)參照DEMO程序。
2、VB語(yǔ)言環(huán)境開發(fā)說(shuō)明
在VB環(huán)境下將modbus.dll、serialmodbus.slip(許可文件)復(fù)制到應(yīng)用程序目錄下(即將上述文件與編譯后的可執(zhí)行文件方入同一文件夾內(nèi));
函數(shù)說(shuō)明中給出的是Delphi的函數(shù)原型,在VB中聲明時(shí)只要注意一下類型的對(duì)應(yīng)即可Delphi中的longint類型對(duì)應(yīng)VB中的Long類型、
Delphi中的Pchar對(duì)應(yīng)VB中的String類型,下面給出主要函數(shù)的聲明:
Private Declare Function ComOpen Lib "modbus.dll" (ByVal nport As Long, ByVal BaudRate As Long, ByVal DataBits As Long, ByVal Parity As Long, ByVal StopBits As Long, ByVal User As String) As Long
Private Declare Function ComClose Lib "modbus.dll" (ByVal nport As Long) As Long
Private Declare Function FCN01 Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Count As Long) As String
Private Declare Function FCN02 Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Count As Long) As String
Private Declare Function FCN03 Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Count As Long) As String
Private Declare Function FCN04 Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Count As Long) As String
Private Declare Function FCN05S Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long) As Long
Private Declare Function FCN05R Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long) As Long
Private Declare Function FCN06 Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Sendstr As String) As Long
Private Declare Function FCN15 Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Count As Long, ByVal Sendstr As String) As Long
Private Declare Function FCN16 Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Count As Long, ByVal Sendstr As String) As Long
Private Declare Function FCN16_xSet Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Bit As Long) As Long
Private Declare Function FCN16_xReset Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Bit As Long) As Long
Private Declare Function FCN16_xSetReset Lib "modbus.dll" (ByVal nport As Long, ByVal node As Long, ByVal address As Long, ByVal Bit As Long) As Long
Private Declare Function ComTrue Lib "modbus.dll" (ByVal nport As Long) As Long
Private Declare Function MyBeep Lib "modbus.dll" (ByVal SoundHz As Long) As Long
Private Declare Function CinBin Lib "modbus.dll" (ByVal CHex As Long, ByVal start As Long) As Long
其它附加函數(shù)VB有實(shí)用函數(shù),建議用VB自帶函數(shù),如需使用聲明參上面的例子給相應(yīng)的函數(shù)聲明;做完上述聲明后,便可以在程序中使用
相關(guān)函數(shù)了。本DLL是串口通信庫(kù),通信時(shí)必須先使用ComOpen函數(shù)打開串口,在串口打開后可以有效操作相關(guān)函數(shù),為保證通信可以在
程序運(yùn)行開始時(shí)打開串口,程序退出前關(guān)閉串口。在應(yīng)用程序關(guān)閉之前請(qǐng)務(wù)必將關(guān)閉所有串口,如您的程序串口沒(méi)有關(guān)閉退出程序?qū)?br />
出異常。當(dāng)出現(xiàn)這樣的異常請(qǐng)更改您的程序,確保應(yīng)用程序在關(guān)閉釋放前關(guān)閉所打開的串口。
解決方法,在form的Unload事件中加入如下例:
If ComTrue(1)=1 then
ComClose(1)
End if
為確保Unload事件有效執(zhí)行程序中不應(yīng)使用“End”語(yǔ)句,而盡量使用“Unload”語(yǔ)句釋放所有窗體,因使用“End”語(yǔ)句系統(tǒng)不會(huì)執(zhí)行
正常的窗體釋放等事件而直接退出程序,如程序中有form1,form2兩個(gè)窗體,則使用下面語(yǔ)句:
Unload form1
Unload form2
VB會(huì)在所有窗體關(guān)閉后釋放所有占用資源。上述可以詳細(xì)參照DEMO程序。當(dāng)然也可在使用“End”語(yǔ)句前將串口關(guān)閉也是可以釋放串口的。
3、VC語(yǔ)言環(huán)境開發(fā)說(shuō)明
在VC環(huán)境下將modbus.dll、serialmodbus.slip(許可文件)復(fù)制到應(yīng)用程序目錄下(即將上述文件與編譯后的可執(zhí)行文件方入同一文件夾內(nèi));
在VC中使用DLL一般都是采用動(dòng)態(tài)聲明的方式,函數(shù)說(shuō)明中給出的是Delphi的函數(shù)原型,在VC中聲明時(shí)只要注意一下類型的對(duì)應(yīng)即可
Delphi中的longint類型對(duì)應(yīng)VC中的Long類型、Delphi中的Pchar對(duì)應(yīng)VC中的char* 類型,下面給出主要函數(shù)的聲明:
在工程主文件cpp中聲明一個(gè)句柄:
HINSTANCE m_handle;
用來(lái)標(biāo)識(shí)導(dǎo)入的動(dòng)態(tài)鏈接庫(kù)。
1)、導(dǎo)入動(dòng)態(tài)鏈接庫(kù),如例所示:
m_handle =:: LoadLibrary("modbus.dll");
2)、按下例說(shuō)明聲明相關(guān)各個(gè)函數(shù):
typedef long (CALLBACK* pOpen)(long nport, long BaudRate, long DataBits, long Parity, long StopBits, char* User);
typedef long (CALLBACK* pClose)(long nport);
typedef char* (CALLBACK* pFCN01)(long nport, long node, long address, long Count);
typedef char* (CALLBACK* pFCN02)(long nport, long node, long address, long Count);
typedef char* (CALLBACK* pFCN03)(long nport, long node, long address, long Count);
typedef char* (CALLBACK* pFCN04)(long nport, long node, long address, long Count);
typedef long (CALLBACK* pFCN05S)(long nport, long node, long address);
typedef long (CALLBACK* pFCN05R)(long nport, long node, long address);
typedef long (CALLBACK* pFCN06)(long nport, long node, long address, char* Sendstr);
typedef long (CALLBACK* pFCN15)(long nport, long node, long address, long Count, char* Sendstr);
typedef long (CALLBACK* pFCN16)(long nport, long node, long address, long Count, char* Sendstr);
typedef long (CALLBACK* pFCN16_xSet)(long nport, long node, long address, long Bit);
typedef long (CALLBACK* pFCN16_xReset)(long nport, long node, long address, long Bit);
typedef long (CALLBACK* pFCN16_xSetReset)(long nport, long node, long address, long Bit);
typedef long (CALLBACK* pTrue)(long nport);
typedef char* (CALLBACK* pIntHex)(long Dcint,long Digits);
typedef long (CALLBACK* pHexInt)( char* CHex);
typedef long (CALLBACK* pBin)( long Chex, long Start);
typedef char* (CALLBACK* pLeft)( char* Text, long Count);
typedef char* (CALLBACK* pRight)( char* Text, long Count);
typedef char* (CALLBACK* pMid)( char* Text, long Start, long Count);
typedef long (CALLBACK* pinstr)( char* Ostr, char* Ckstr, Long Dcint);
typedef long (CALLBACK* pBeep)( long SoundHz);
3)、聲明并建立動(dòng)態(tài)鏈接庫(kù)中的函數(shù)與新函數(shù)名的對(duì)應(yīng)關(guān)系,如下:
pOpen Copen = (pOpen)GetProcAddress(m_handle,"ComOpen");
pClose Cclose = (pClose)GetProcAddress(m_handle,"ComClose");
pFCN01 CFCN01 = (pFCN01)GetProcAddress(m_handle,"FCN01");
pFCN02 CFCN02 = (pFCN02)GetProcAddress(m_handle,"FCN02");
pFCN03 CFCN03 = (pFCN03)GetProcAddress(m_handle,"FCN03");
pFCN04 CFCN04 = (pFCN04)GetProcAddress(m_handle,"FCN04");
pFCN05S CFCN05S = (pFCN05S)GetProcAddress(m_handle,"FCN05S");
pFCN05R CFCN05R = (pFCN05R)GetProcAddress(m_handle,"FCN05R");
pFCN15 CFCN15 = (pFCN15)GetProcAddress(m_handle,"FCN15");
pFCN16 CFCN16 = (pFCN16)GetProcAddress(m_handle,"FCN16");
pFCN16_xSet CFCN16_xSet = (pFCN16_xSet)GetProcAddress(m_handle,"FCN16_xSet");
pFCN16_xReset CFCN16_xReset = (pFCN16_xReset)GetProcAddress(m_handle,"FCN16_xReset");
pFCN16_xSetReset CFCN16_xSetReset = (pFCN16_xSetReset)GetProcAddress(m_handle,"FCN16_xSetReset");
pTrue Ctrue = (pTrue)GetProcAddress(m_handle," ComTrue");
pIntHex Cinthex = (pIntHex)GetProcAddress(m_handle," CIntToHex");
pHexInt Chexint = (pHexInt)GetProcAddress(m_handle," CHexToInt");
pBin Cbin = (pBin)GetProcAddress(m_handle," CinBin");
pLeft Cleft = (pLeft)GetProcAddress(m_handle," CLeftStr");
pRight Cright = (pRight)GetProcAddress(m_handle," CRightStr");
pMid Cmid= (pMid)GetProcAddress(m_handle," CMidStr");
pinstr Cinstr=(pinstr)GetProcAddress(m_handle," CinStr");
pTrue CBeep = (pBeep)GetProcAddress(m_handle," MyBeep");
注:雙引號(hào)中為動(dòng)態(tài)鏈接庫(kù)中的函數(shù)名。
4)、接下來(lái)就可以自由使用動(dòng)態(tài)鏈接庫(kù)中的函數(shù)了,如:
Copen(參數(shù)略);
Cclose(參數(shù)略);
CFCN01(參數(shù)略);
CFCN02(參數(shù)略);
CFCN03(參數(shù)略);
CFCN04(參數(shù)略);
CFCN05S(參數(shù)略);
CFCN05R(參數(shù)略);
CFCN15(參數(shù)略);
CFCN16(參數(shù)略);
CFCN16_xSet(參數(shù)略);
CFCN16_xReset(參數(shù)略);
CFCN16_xSetReset(參數(shù)略);
Ctrue(參數(shù)略);
Cinthex(參數(shù)略);
Chexint(參數(shù)略);
Cbin(參數(shù)略);
Cleft(參數(shù)略);
Cright(參數(shù)略);
Cmid(參數(shù)略);
Cinstr(參數(shù)略);
CBeep(參數(shù)略);
注:函數(shù)中用到了char*型參數(shù),這里介紹下char*與Cstring的相互轉(zhuǎn)換的函數(shù):
(1)char*->CString
char* sz;
CString str;
str.Format("%s",sz); //可以用此函數(shù)將讀取的值轉(zhuǎn)成字符串
(2) CString -> char*
CString str;
char* sz = str.GetBuffer(0);//可將字符串轉(zhuǎn)成char*給函數(shù)賦值
5)、當(dāng)不再需要使用DLL時(shí)記得關(guān)閉串口及釋放動(dòng)態(tài)鏈接庫(kù),如:
關(guān)閉串口
if cTrue(1)==1 then
{
cClose(1);
}
6)、釋放DLL
FreeLibrary(m_handle);
六、詳細(xì)的DLL使用請(qǐng)參DEMO程序,相關(guān)DEMO程序和說(shuō)明所使用的開發(fā)環(huán)境VB指的是VB6.0,Delphi指的是Delphi6.0/Delphi7.0,
VC指的是VC6.0。如果使用了高版本開發(fā)環(huán)境請(qǐng)根據(jù)開發(fā)軟件更新后所兼容的聲明方式進(jìn)行聲明調(diào)用。VC的串口調(diào)用沒(méi)DEMO程序
請(qǐng)參照本手冊(cè)的說(shuō)明進(jìn)行調(diào)用(本說(shuō)明的方法經(jīng)過(guò)測(cè)試是可行有效的)。
DLl已經(jīng)過(guò)使用和測(cè)試具有很好的穩(wěn)定性(測(cè)試平臺(tái)為Win2000/WinXP),目前還沒(méi)有用戶方面返回的缺陷報(bào)告,如果你在使用過(guò)程中發(fā)現(xiàn)
有什么缺陷也請(qǐng)和我聯(lián)系,我將在最短時(shí)間內(nèi)給你更新升級(jí)(更新升級(jí)只針對(duì)注冊(cè)用戶)。
作者: wjun7610
QQ: 157610979
淘寶店:
http://shop34821629.taobao.com