成人精品一区二区久久久 I 国产美女永久无遮挡 I 中文字幕+乱码+中文字幕明步 I 国产在视频一区二区三区吞精 I 日韩精品小视频 I 成人性生交大片免费4 I 免费aaa级毛片在线视频 I 一级片毛片 I 大型成人社区 I 国模在线播放 I 欧美大荫蒂毛茸茸视频 I 偷偷色噜狠狠狠狠的777米奇 I www.久久亚洲 I 日日搞夜夜操 I 亚洲成色777777女色窝 I 毛片黄色毛片 I 午夜片在线观看 I 国产一区二区三区中文字幕 I 天天干夜夜骑 I 日韩在线视频一区二区三区 I 久久久无码精品亚洲a片0000 I 写真福利片hd在线播放 I 欧美成人一区二免费视频 I 色噜噜狠狠爱综合视频 I 中文字幕无线码免费人妻 I 国产精品久久久久久久久久不蜜臀 I 欧美综合人人做人人爱 I 1024成人网色www I 国产精品视频一二三区 I 亚洲免费美女视频

wjun7610
級(jí)別: 略有小成
精華主題: 0
發(fā)帖數(shù)量: 110 個(gè)
工控威望: 249 點(diǎn)
下載積分: 708 分
在線時(shí)間: 35(小時(shí))
注冊(cè)時(shí)間: 2007-09-16
最后登錄: 2025-07-30
查看wjun7610的 主題 / 回貼
樓主  發(fā)表于: 2008-07-19 19:10
modbus rtu通信協(xié)議串口通訊動(dòng)態(tài)鏈接庫(kù)DLL(以下簡(jiǎn)稱DLL),是為滿足工業(yè)通信需要,
針對(duì)工業(yè)領(lǐng)域要求上位機(jī)對(duì)PLC、工業(yè)儀表通訊實(shí)時(shí)采集與控制的組態(tài)編程而設(shè)計(jì)。
本DLL是采用Delphi語言開發(fā)的標(biāo)準(zhǔn)串口通訊庫(kù),具有以下特點(diǎn):
1)、遵循modbus rtu串口通訊協(xié)議(施耐德、西門子、臺(tái)達(dá)、永宏等品牌PLC及各類工業(yè)儀表等支持本協(xié)議);
2)、實(shí)時(shí)性、可靠性好,通用性強(qiáng);
3)、適用于多PLC聯(lián)網(wǎng)和上位機(jī)通信,滿足多方面的需要(聯(lián)網(wǎng)時(shí)可采用485總線式);
4)、函數(shù)接口功能全,操作簡(jiǎn)單,支持modbus的大部分讀寫功能函數(shù);
5)、附加實(shí)用轉(zhuǎn)換與讀取函數(shù),易于快速開發(fā)(VC等非RAD開發(fā)環(huán)境的開發(fā));
6)、支持USB、PC擴(kuò)展卡等擴(kuò)展串口號(hào);
7)、支持多種操作系統(tǒng)win9x/win2000/winXP(標(biāo)注Win32 DLL);
8)、可在多種編程環(huán)境下使用,例如VB、VC、Delphi等開發(fā)環(huán)境。

9)、支持modbus rtu標(biāo)準(zhǔn)的功能代碼01、02、03、04、05、06、15、16且對(duì)相關(guān)功能代碼的讀取和寫如做了一些擴(kuò)充更加符合工業(yè)自動(dòng)化領(lǐng)域的工控軟件的開發(fā),是廣大工控工程師的必備工具軟件。

二、modbus rtu通訊協(xié)議簡(jiǎn)介

    Modbus 協(xié)議是應(yīng)用于電子控制器上的一種通用語言。通過此協(xié)議,控制器相互之間、控制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))
和其它設(shè)備之間可以通信。它已經(jīng)成為一通用工業(yè)標(biāo)準(zhǔn)。有了它,不同廠商生產(chǎn)的控制設(shè)備可以連成工業(yè)網(wǎng)絡(luò),進(jìn)行集
中監(jiān)控。此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過何種網(wǎng)絡(luò)進(jìn)行通信的。它描述了一控制器請(qǐng)
求訪問其它設(shè)備的過程,如果回應(yīng)來自其它設(shè)備的請(qǐng)求,以及怎樣偵測(cè)錯(cuò)誤并記錄。它制定了消息域格局和內(nèi)容的公共
格式。當(dāng)在一Modbus網(wǎng)絡(luò)上通信時(shí),此協(xié)議決定了每個(gè)控制器須要知道它們的設(shè)備地址,識(shí)別按地址發(fā)來的消息,決定
要產(chǎn)生何種行動(dòng)。如果需要回應(yīng),控制器將生成反饋信息并用Modbus協(xié)議發(fā)出。在其它網(wǎng)絡(luò)上,包含了Modbus協(xié)議的消
息轉(zhuǎn)換為在此網(wǎng)絡(luò)上使用的幀或包結(jié)構(gòu)。這種轉(zhuǎn)換也擴(kuò)展了根據(jù)具體的網(wǎng)絡(luò)解決節(jié)地址、路由路徑及錯(cuò)誤檢測(cè)的方法。
1、在Modbus網(wǎng)絡(luò)上轉(zhuǎn)輸
標(biāo)準(zhǔn)的Modbus口是使用一RS-232C兼容串行接口,它定義了連接口的針腳、電纜、信號(hào)位、傳輸波特率、奇偶校驗(yàn)。控制
器能直接或經(jīng)由Modem組網(wǎng)。控制器通信使用主—從技術(shù),即僅一設(shè)備(主設(shè)備)能初始化傳輸(查詢)。其它設(shè)備(從設(shè)備)
根據(jù)主設(shè)備查詢提供的數(shù)據(jù)作出相應(yīng)反應(yīng)。典型的主設(shè)備:主機(jī)和可編程儀表。典型的從設(shè)備:可編程控制器。主設(shè)備
可單獨(dú)和從設(shè)備通信,也能以廣播方式和所有從設(shè)備通信。如果單獨(dú)通信,從設(shè)備返回一消息作為回應(yīng),如果是以廣播
方式查詢的,則不作任何回應(yīng)。Modbus協(xié)議建立了主設(shè)備查詢的格式:設(shè)備(或廣播)地址、功能代碼、所有要發(fā)送的數(shù)
據(jù)、一錯(cuò)誤檢測(cè)域。從設(shè)備回應(yīng)消息也由Modbus協(xié)議構(gòu)成,包括確認(rèn)要行動(dòng)的域、任何要返回的數(shù)據(jù)、和一錯(cuò)誤檢測(cè)域。
如果在消息接收過程中發(fā)生一錯(cuò)誤,或從設(shè)備不能執(zhí)行其命令,從設(shè)備將建立一錯(cuò)誤消息并把它作為回應(yīng)發(fā)送出去。
2、在其它類型網(wǎng)絡(luò)上轉(zhuǎn)輸
在其它網(wǎng)絡(luò)上,控制器使用對(duì)等技術(shù)通信,故任何控制都能初始和其它控制器的通信。這樣在單獨(dú)的通信過程中,控制
器既可作為主設(shè)備也可作為從設(shè)備。提供的多個(gè)內(nèi)部通道可允許同時(shí)發(fā)生的傳輸進(jìn)程。在消息位,Modbus協(xié)議仍提供了
主—從原則,盡管網(wǎng)絡(luò)通信方法是“對(duì)等”。如果一控制器發(fā)送一消息,它只是作為主設(shè)備,并期望從從設(shè)備得到回應(yīng)。
同樣,當(dāng)控制器接收到一消息,它將建立一從設(shè)備回應(yīng)格式并返回給發(fā)送的控制器。
3、查詢—回應(yīng)周期
(1)、查詢    
    查詢消息中的功能代碼告之被選中的從設(shè)備要執(zhí)行何種功能。數(shù)據(jù)段包含了從設(shè)備要執(zhí)行功能的任何附加信息。例
如功能代碼03是要求從設(shè)備讀保持寄存器并返回它們的內(nèi)容。數(shù)據(jù)段必須包含要告之從設(shè)備的信息:從何寄存器開始讀
及要讀的寄存器數(shù)量。錯(cuò)誤檢測(cè)域?yàn)閺脑O(shè)備提供了一種驗(yàn)證消息內(nèi)容是否正確的方法。
(2)、回應(yīng)    
    如果從設(shè)備產(chǎn)生一正常的回應(yīng),在回應(yīng)消息中的功能代碼是在查詢消息中的功能代碼的回應(yīng)。數(shù)據(jù)段包括了從設(shè)備
收集的數(shù)據(jù):象寄存器值或狀態(tài)。如果有錯(cuò)誤發(fā)生,功能代碼將被修改以用于指出回應(yīng)消息是錯(cuò)誤的,同時(shí)數(shù)據(jù)段包含
了描述此錯(cuò)誤信息的代碼。錯(cuò)誤檢測(cè)域允許主設(shè)備確認(rèn)消息內(nèi)容是否可用。

3、兩種傳輸方式
    控制器能設(shè)置為兩種傳輸模式(ASCII或RTU)中的任何一種在標(biāo)準(zhǔn)的Modbus網(wǎng)絡(luò)通信。用戶選擇想要的模式,包括串
口通信參數(shù)(波特率、校驗(yàn)方式等),在配置每個(gè)控制器的時(shí)候,在一個(gè)Modbus網(wǎng)絡(luò)上的所有設(shè)備都必須選擇相同的傳輸
模式和串口參數(shù)。
ASCII模式
   -------------------------------------------
   | 地址 | 功能代碼 | 數(shù)據(jù)數(shù)量 | 數(shù)據(jù)1 ... 數(shù)據(jù)n | LRC高字節(jié) | LRC低字節(jié) | 回車 | 換行 |
   -------------------------------------------
RTU模式
   ------------------------------------
   | 地址 | 功能代碼 | 數(shù)據(jù)數(shù)量 | 數(shù)據(jù)1 ... 數(shù)據(jù)n | CRC高字節(jié) | CRC低字節(jié) |
   ------------------------------------
    所選的ASCII或RTU方式僅適用于標(biāo)準(zhǔn)的Modbus網(wǎng)絡(luò),它定義了在這些網(wǎng)絡(luò)上連續(xù)傳輸?shù)南⒍蔚拿恳晃唬约皼Q定
怎樣將信息打包成消息域和如何解碼。在其它網(wǎng)絡(luò)上(象MAP和Modbus Plus)Modbus消息被轉(zhuǎn)成與串行傳輸無關(guān)的幀。
    因ASCII模式通訊效率較低一多采用RTU模式,這里只對(duì)RTU模式進(jìn)行詳細(xì)介紹。

4、Modbus RTU模式

    當(dāng)控制器設(shè)為在Modbus網(wǎng)絡(luò)上以RTU(遠(yuǎn)程終端單元)模式通信,在消息中的每個(gè)8Bit字節(jié)包含兩個(gè)4Bit的十六進(jìn)制
字符。這種方式的主要優(yōu)點(diǎn)是:在同樣的波特率下,可比ASCII方式傳送更多的數(shù)據(jù)。

代碼系統(tǒng)

    8位二進(jìn)制,十六進(jìn)制數(shù)0...9,A...F
    消息中的每個(gè)8位域都是一個(gè)兩個(gè)十六進(jìn)制字符組成

每個(gè)字節(jié)的位

    1個(gè)起始位
    8個(gè)數(shù)據(jù)位,最小的有效位先發(fā)送
    1個(gè)奇偶校驗(yàn)位,無校驗(yàn)則無
    1個(gè)停止位(有校驗(yàn)時(shí)),2個(gè)Bit(無校驗(yàn)時(shí))

錯(cuò)誤檢測(cè)域
    
     CRC(循環(huán)冗長(zhǎng)檢測(cè))

地址域

    消息幀的地址域包含8Bit(RTU)。可能的從設(shè)備地址是0...247(十進(jìn)制)。單個(gè)設(shè)備的地址范圍是1...247。主設(shè)備通過
將要聯(lián)絡(luò)的從設(shè)備的地址放入消息中的地址域來選通從設(shè)備。當(dāng)從設(shè)備發(fā)送回應(yīng)消息時(shí),它把自己的地址放入回應(yīng)的地址域
中,以便主設(shè)備知道是哪一個(gè)設(shè)備作出回應(yīng)。地址0是用作廣播地址,以使所有的從設(shè)備都能認(rèn)識(shí)。當(dāng)Modbus協(xié)議用于更高
水準(zhǔn)的網(wǎng)絡(luò),廣播可能不允許或以其它方式代替。

如何處理功能域

    數(shù)據(jù)域是由兩個(gè)十六進(jìn)制數(shù)集合構(gòu)成的,范圍00...FF。根據(jù)網(wǎng)絡(luò)傳輸模式,這可以是由一RTU字符組成。從主設(shè)備發(fā)給
從設(shè)備消息的數(shù)據(jù)域包含附加的信息:從設(shè)備必須用于進(jìn)行執(zhí)行由功能代碼所定義的所為。這包括了象不連續(xù)的寄存器地址,
要處理項(xiàng)的數(shù)目,域中實(shí)際數(shù)據(jù)字節(jié)數(shù)。例如,如果主設(shè)備需要從設(shè)備讀取一組保持寄存器(功能代碼03),數(shù)據(jù)域指定了起
始寄存器以及要讀的寄存器數(shù)量。如果主設(shè)備寫一組從設(shè)備的寄存器(功能代碼10十六進(jìn)制),數(shù)據(jù)域則指明了要寫的起始寄
存器以及要寫的寄存器數(shù)量,數(shù)據(jù)域的數(shù)據(jù)字節(jié)數(shù),要寫入寄存器的數(shù)據(jù)。如果沒有錯(cuò)誤發(fā)生,從從設(shè)備返回的數(shù)據(jù)域包含
請(qǐng)求的數(shù)據(jù)。如果有錯(cuò)誤發(fā)生,此域包含一異議代碼,主設(shè)備應(yīng)用程序可以用來判斷采取下一步行動(dòng)。在某種消息中數(shù)據(jù)域
可以是不存在的(0長(zhǎng)度)。例如,主設(shè)備要求從設(shè)備回應(yīng)通信事件記錄(功能代碼0B十六進(jìn)制),從設(shè)備不需任何附加的信息。

作者:  wjun7610
QQ:    157610979
淘寶店:http://shop34821629.taobao.com
[ 此貼被wjun7610在2008-07-20 14:25重新編輯 ]
附件: Modbus.rar (153 K) 下載次數(shù):2208
wjun7610
級(jí)別: 略有小成
精華主題: 0
發(fā)帖數(shù)量: 110 個(gè)
工控威望: 249 點(diǎn)
下載積分: 708 分
在線時(shí)間: 35(小時(shí))
注冊(cè)時(shí)間: 2007-09-16
最后登錄: 2025-07-30
查看wjun7610的 主題 / 回貼
1樓  發(fā)表于: 2008-07-19 19:10
三、DLL函數(shù)說明


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è)除了下面說明的功能限制外沒有其他限制,未注冊(cè)用戶請(qǐng)使用特定用戶名:wangjun。

    注冊(cè)用戶功能上無任何限制,且將得到永久的軟件使用和更新升級(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ù)的說明不再重復(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@”

注:沒有注冊(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@”

注:沒有注冊(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@”

注:沒有注冊(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@”

注:沒有注冊(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表示成功

注:沒有注冊(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表示成功

注:沒有注冊(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表示成功

注:沒有注冊(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         |
            -----------------------------------------

注:沒有注冊(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表示成功;

注:沒有注冊(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表示成功

注:沒有注冊(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表示成功

注:沒有注冊(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表示成功

注:沒有注冊(cè)的用戶不能使用本功能;

四、DLL附加函數(shù)說明 (本段函數(shù)對(duì)未注冊(cè)用戶沒有限制,完全可以使用。)

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)警過程函數(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語言環(huán)境的開發(fā)使用說明

1、Delphi語言環(huán)境開發(fā)說明

在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)閉所有串口,如串口沒有關(guān)閉

而退出程序?qū)伋霎惓ee(cuò)誤。

確保應(yīng)用程序在關(guān)閉釋放前關(guān)閉打開的串口。解決方法,在form的OnDestroy事件中加入如下語句:

for i:=1 to 8 do
begin
  if ComTrue(i)=1 then ComClose(i);
end;

在Delphi中給中給DLL中的函數(shù)傳pchar值問題,建議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語言環(huán)境開發(fā)說明

在VB環(huán)境下將modbus.dll、serialmodbus.slip(許可文件)復(fù)制到應(yīng)用程序目錄下(即將上述文件與編譯后的可執(zhí)行文件方入同一文件夾內(nèi));

函數(shù)說明中給出的是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)閉所有串口,如您的程序串口沒有關(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”語句,而盡量使用“Unload”語句釋放所有窗體,因使用“End”語句系統(tǒng)不會(huì)執(zhí)行

正常的窗體釋放等事件而直接退出程序,如程序中有form1,form2兩個(gè)窗體,則使用下面語句:

Unload  form1
Unload  form2

VB會(huì)在所有窗體關(guān)閉后釋放所有占用資源。上述可以詳細(xì)參照DEMO程序。當(dāng)然也可在使用“End”語句前將串口關(guān)閉也是可以釋放串口的。

3、VC語言環(huán)境開發(fā)說明

在VC環(huán)境下將modbus.dll、serialmodbus.slip(許可文件)復(fù)制到應(yīng)用程序目錄下(即將上述文件與編譯后的可執(zhí)行文件方入同一文件夾內(nèi));

在VC中使用DLL一般都是采用動(dòng)態(tài)聲明的方式,函數(shù)說明中給出的是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;

用來標(biāo)識(shí)導(dǎo)入的動(dòng)態(tài)鏈接庫(kù)。

1)、導(dǎo)入動(dòng)態(tài)鏈接庫(kù),如例所示:

   m_handle =:: LoadLibrary("modbus.dll");

2)、按下例說明聲明相關(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)、接下來就可以自由使用動(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程序和說明所使用的開發(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)用沒DEMO程序

請(qǐng)參照本手冊(cè)的說明進(jìn)行調(diào)用(本說明的方法經(jīng)過測(cè)試是可行有效的)。

DLl已經(jīng)過使用和測(cè)試具有很好的穩(wěn)定性(測(cè)試平臺(tái)為Win2000/WinXP),目前還沒有用戶方面返回的缺陷報(bào)告,如果你在使用過程中發(fā)現(xiàn)

有什么缺陷也請(qǐng)和我聯(lián)系,我將在最短時(shí)間內(nèi)給你更新升級(jí)(更新升級(jí)只針對(duì)注冊(cè)用戶)。

作者:  wjun7610
QQ:    157610979
淘寶店:http://shop34821629.taobao.com

主站蜘蛛池模板: 露脸丨91丨九色露脸 | 五月婷婷开心中文字幕 | 国产盗摄av | 亚洲中国久久精品无码 | 999久久欧美人妻一区二区 | av黄色一区 | 久久r| 超碰999 | 人妻有码中文字幕 | 国精产品一区一区三区mba下载 | 亚洲一级免费视频 | 亚洲区少妇熟女专区 | 91成人毛片| 一区二区三区四区毛片 | 极品 在线 视频 大陆 国产 | 亚洲日韩av一区二区三区四区 | 狠狠狠色丁香婷婷综合久久五月 | 中文字幕1区2区 | 亚洲色欲色欲高清无码 | 亚洲成人精品网 | 夜夜操天天艹 | 爱情岛aqdlt国产论坛 | 在线看片免费人成视频影院看 | 男人的天堂日韩 | 国产精品成人无码a片在线看 | 九九久久精品 | 亚洲成在人网站av天堂 | 骚女人干起来舒服视频在线 | 人妻少妇精品久久久久久 | 久久久久日本精品一区二区三区 | 中文字幕第7页 | 91久久久久久亚洲精品禁果 | 男女一进一出超猛烈的视频不遮挡在线观看 | 影视先锋av资源噜噜 | 亚洲欧美精品在线观看 | 天堂久久精品 | 亚洲成年网站 | 男女精品网站 | 狠狠狠色丁香婷婷综合久久五月 | 日本欧美在线 | 成人午夜小视频 | 另类小说婷婷 | 人人入人人 | 99视频精品全部免费 在线 | 欧美色图视频在线 | 色综合久久婷婷 | 热久久精品 | 无码无遮挡在线观看免费 | 久久精品国产2020 | 久久精品国产一区二区电影 | 久精品视频在线观看免费 | 日韩六区| 男人的天堂免费视频 | 九九精品无码专区免费 | 一区二区三区黄色录像 | 婷婷五月综合激情中文字幕 | 久久精品久久久久久 | 国内毛片毛片毛片毛片毛片 | 国产日韩一区 | 主站蜘蛛池模板: 蛛词}| 夜夜夜夜猛噜噜噜噜噜试看 | 精品无码久久久久久国产 | 久久精品无码一区二区三区 | 亚洲 欧美 另类 综合 日韩 | 成人亚洲欧美 | 日日摸天天摸97狠狠婷婷 | 欧美色图在线播放 | 精品国产污污免费网站入口 | 国产精品77777竹菊影视小说 | 偷拍中国夫妇高潮视频 | 日产亚洲一区二区三区 | 欧美日韩国产中文字幕 | 日韩爆乳一区二区无码 | 女人裸体做爰免费视频 | 成人美女视频在线观看 | 国产亚洲久久久久久久 | 少妇无码av无码专区 | 伊人久久大香线蕉综合直播 | 久久综合九色综合久99 | 九九热在线视频精品店 | 鲁一鲁av2019在线 | 精品欧美一区二区久久久 | 欧美丰满妇大ass | 国产亚洲精品久久久久秋霞 | 中文字幕av无码不卡免费 | av在线第一页 | 免费国产va在线观看中文字 | 又粗又硬又大又爽免费视频播放 | 亚洲欧美日韩精品专区 | 日本不卡视频一区二区三区 | 久久婷婷五月综合色俺也想去 | 欧美视频在线免费播放 | 亚洲人成色777777老人头 | 丰满爆乳无码一区二区三区 | 国产精品www视频 | 自拍视频啪| 亚洲第一视频区 | 亚洲欧美vr色区 | 成 人 黄 色 片 在线播放 | 亚洲第一成年免费网站 | 国产精品熟妇视频国产偷人 | 香蕉久久夜色精品 | 免费人成网站在线观看视频 | 少妇无套内谢久久久久 | a天堂在线观看 | 99精品欧美一区二区 | 久久亚洲道色综合久久 | 日本妇人成熟免费中文字幕 | 成人免费精品网站在线观看影片 | 国产精品黄视频 | 在线a免费| 91精品综合久久久久久五月天 | 欧美日韩五月天 | 他掀开裙子把舌头伸进去添视频 | 日本大尺度吃奶呻吟视频 | 欧美黄色动态图 | 午夜在线不卡精品国产 | 性饥渴艳妇性色生活片在线播放 | 久久久人人人婷婷色东京热 | 主站蜘蛛池模板: 蛛词}| 精品夜夜澡人妻无码av | 久久人妻无码一区二区三区av | 亚洲精品粉嫩小仙女高潮 | 中文高清av | 国产精品自在线拍国产手青青机版 | 成人一区二区免费视频 | 国产av亚洲精品久久久久李知恩 | 无码视频一区二区三区 | 亚洲男人第一网站 | 嫩草影院在线观看视频 | 亚洲中文字幕va福利 | 色久影院 | 国产精品人成视频免费国产 | 偷窥 亚洲 另类 图片 熟女 | 视频一二区 | 男人扒开女人腿桶到爽免费 | 国产日韩欧美日韩 | 婷婷成人激情 | 成人在线视频你懂的 | 天天夜夜啦啦啦 | 视频一区二区三区中文字幕 | 免费看成人aa片无码视频吃奶 | 天堂8最新版 | 久久高清超碰av热热久久 | 成人精品毛片va一区二区三区 | 亚洲精品久久久久久久久毛片直播 | 91夜夜揉人人捏人人添红杏 | 日日碰狠狠添天天爽超碰97久久 | 久久人人艹 | 亚洲成人网在线观看 | 国产xxxx视频在线 | 亚洲成a人片在线观看无码专区 | 高h各种姿势调教np肉奴视频 | 无码国产偷倩在线播放 | 99九九热| 国产精品免费久久久久软件 | 国产精品97色综合国产精品 | 国产欧美久久久精品影院 | 五月激情日韩欧美啪啪婷婷 | 久久夜色精品国产欧美一区麻豆 | 亚洲六月丁香色婷婷综合久久 | 国产成人久久777777 | 亚洲性久久久 | 耽肉高h喷汁呻吟j产奶视频 | 免费观看日韩毛片 | 免费午夜拔丝袜www在线看 | 亚洲综合无码无在线观看 | 日韩精品免费在线视频 | 欧美老熟| 久一精品 | 国产精品久久久久无码av | 国产精品亚洲片在线观看不卡 | 欧美精品黑人猛交高潮 | 精品国产一区二区av片 | 黄色日比视频 | 国产精品白丝久久av网站 | 国产精品涩涩屋www在线观看 | 国产午夜无码精品免费看动漫 | 色综合av社区男人的天堂 | 主站蜘蛛池模板: 蛛词}| 99国产欧美精品久久久蜜芽 | 成人啪啪 | 久久久av免费 | 国产午夜福利在线观看红一片 | 久久夜色撩人精品国产av | 无码办公室丝袜ol中文字幕 | 午夜三级a三级三点在线观看 | 一本色道无码不卡在线观看 | 国产精品乱码一区二区 | 午夜丰满寂寞少妇精品 | 热热色国产 | 蜜芽tv国产在线精品三区 | 国产一区二区久久 | 欧美精品一区二区a片免费 路边理发店露脸熟妇泻火 国产成年女人特黄特色大片免费 | 亚欧美无遮挡hd高清在线视频 | 国产三级精品三级男人的天堂 | av在线无码专区一区 | 最新国内精品自在自线视频 | 亚洲欧美a | 免费人成在线观看网站 | 大胸美女被吃奶爽死视频 | 可以免费观看的毛片 | 波多野结衣欧美 | 国产人妻黑人一区二区三区 | 亚洲va中文慕无码久久av | 精品伦理一区二区 | 99久久久99久久国产片鸭王 | 欧美精品h | 国产成人福利片 | 免费在线性爱视频 | 又嫩又硬又黄又爽的视频 | 亚洲女在线 | 51精品国自产在线 | 大桥未久在线视频 | 无码免费毛片手机在线无卡顿 | 911久久香蕉国产线看观看 | av不卡在线免费观看 | 日韩精品第一页 | 国产乱视频 | 欧美性黑人极品hd变态 | 黑人巨大精品欧美视频一区 | 欧美在线观看视频一区二区三区 | 国产男女猛烈无遮挡 | 亚洲专区在线视频 | 欧美刺激脚交video | 青青精品视频 | 乱码精品一卡2卡二卡三 | yy77777丰满少妇影院 | 97青娱国产盛宴精品视频 | 欧美黑人粗暴多交高潮水最多 | 亚洲产国偷v产偷自拍网址 日韩国产在线看 | 在线观看亚洲专区 | 久久久久日本精品一区二区三区 | 国产a免费| 亚洲精品乱码久久久久久蜜桃不爽 | 日日碰狠狠添天天爽超碰97 | 欧美激情性xxxxx高清真 | 国产精品99无码一区二区 | 8x8ⅹ在线永久免费入口 | 主站蜘蛛池模板: 蛛词}| 无遮无挡三级动态图 | 亚洲成a人v欧美综合天堂麻豆 | 免费无码又爽又刺激毛片 | 1024在线播放 | 日韩国产精品人妻无码久久久 | 一区二区 在线 | 中国 | 永久视频在线观看 | 欧美日韩一区国产 | 日韩在线视频观看免费网站 | 国产五级黄色片 | 自拍偷亚洲产在线观看 | 亚洲欧美激情一区 | 亚洲精品欧美日韩一区 | 欧洲精品卡1区2卡三卡四卡 | 久久综合精品国产丝袜长腿 | 91福利视频导航 | 激情综合色综合啪啪五月丁香搜索 | 午夜自产精品一区二区三区 | 女学生和老头做爰av片 | 成人无码α片在线观看不卡 | 日韩免费久久 | 91亚色| 国产精品久久久久久久久久直播 | 国产又黄又硬又湿又黄的故事 | av一本久道久久综合久久鬼色 | 国产精品久久国产精麻豆99网站 | 午夜免费学生在线观看av | 伊人情人色综合网站 | 高清国产亚洲欧洲av综合一区 | 超碰女| 日一日干一干 | 在线视频亚洲欧美 | 最新国产黄色网址 | 日本妇人成熟免费中文字幕 | 中文字幕 在线 欧美 日韩 制服 | 人妻夜夜爽天天爽三区 | 91传媒91久久久 | 好男人在线社区www在线观看视频 | 亚洲一二三四专区 | 91成品人网页版 | 又黄又爽又色成人免费体验 | 青青在线视频免费 | 欧美成人乱码一区二区三区 | 对白刺激国产子与伦 | 少妇午夜性影院私人影院软件 | 国产精品_九九99久久精品 | 性一交一乱一伦一色一情孩交 | 91制片一二三专区亚洲 | 久草在线资源视频 | 中文字幕第八页 | 99日在线视频 | 精品亚洲aⅴ无码一区二区三区 | 日韩 国产 在线 | 无码国产午夜福利片在线观看 | 天天高潮夜夜爽 | 欧美gif抽搐出入又大又黄 | 亚洲国产剧情在线观看 | 国产精品美女www爽爽爽软件 | 欧美色欲色欲xxxxx |