




版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、modbus rtu通信協(xié)議串口通訊動(dòng)態(tài)鏈接庫(kù)dll(以下簡(jiǎn)稱(chēng)dll),是為滿(mǎn)足工業(yè)通信需要, 針對(duì)工業(yè)領(lǐng)域要求上位機(jī)對(duì)plc、工業(yè)儀表通訊實(shí)時(shí)采集與控制的組態(tài)編程而設(shè)計(jì)。 本dll是采用delphi語(yǔ)言開(kāi)發(fā)的標(biāo)準(zhǔn)串口通訊庫(kù),具有以下特點(diǎn):1)、遵循modbus rtu串口通訊協(xié)議(施耐德、西門(mén)子、臺(tái)達(dá)、永宏等品牌plc及各類(lèi)工業(yè) 儀表等支持本協(xié)議);2)、實(shí)時(shí)性、可靠性好,通用性強(qiáng);3)、適用于多plc聯(lián)網(wǎng)和上位機(jī)通信,滿(mǎn)足多方面的需要(聯(lián)網(wǎng)時(shí)可采用485總線(xiàn)式);4)、函數(shù)接口功能全,操作簡(jiǎn)單,支持modbus的大部分讀第功能函數(shù);5)、附加實(shí)用轉(zhuǎn)換與讀取函數(shù),易于快速開(kāi)發(fā)(vc等非rad
2、開(kāi)發(fā)環(huán)境的開(kāi)發(fā));6)、支持usb、pc擴(kuò)展卡等擴(kuò)展串口號(hào);7)、支持多種操作系統(tǒng) win9x/win2000/winxp(標(biāo)注 win32 dll);8)、可在多種編程環(huán)境下使用,例如vb、vc、delphi等開(kāi)發(fā)環(huán)境。9)、支持modbus rtu標(biāo)準(zhǔn)的功能代碼01、02、03、04、05、06、15、16k對(duì)相關(guān)功能代 碼的讀取和寫(xiě)如做了一些擴(kuò)充更加符合工業(yè)口動(dòng)化領(lǐng)域的工控軟件的開(kāi)發(fā),是廣大工控工程 師的必備工具軟件。二、modbus rtu通訊協(xié)議簡(jiǎn)介modbus協(xié)議是應(yīng)用于電子控制器上的一種通用語(yǔ)言。通過(guò)此協(xié)議,控制器相互之間、控 制器經(jīng)由網(wǎng)絡(luò)(例如以太網(wǎng))和其它設(shè)備z間可以通信。它
3、已經(jīng)成為一通用工業(yè)標(biāo)準(zhǔn)。有了它,不同廠(chǎng)商生產(chǎn)的控制設(shè)備 可以連成工業(yè)網(wǎng)絡(luò),進(jìn)行集中監(jiān)控。此協(xié)議定義了一個(gè)控制器能認(rèn)識(shí)使用的消息結(jié)構(gòu),而不管它們是經(jīng)過(guò)何種網(wǎng)絡(luò)進(jìn)行 通信的。它描述了-控制器請(qǐng)求訪(fǎng)問(wèn)其它設(shè)備的過(guò)程,如果冋應(yīng)來(lái)自其它設(shè)備的請(qǐng)求,以及怎樣偵測(cè)錯(cuò)誤并記錄。它制定 了消息域格局和內(nèi)容的公共格式。當(dāng)在一 modbus網(wǎng)絡(luò)上通信時(shí),此i辦議決定了每個(gè)控制器須耍知道它們的設(shè)備地址, 識(shí)別按地址發(fā)來(lái)的消息,決定要產(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ò)解決
4、節(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)??刂破魍ㄐ攀褂弥饕粡募夹g(shù),即僅一設(shè)備(主設(shè)備)能初始化 傳輸(查詢(xún))。其它設(shè)備(從設(shè)備)根據(jù)主設(shè)備查詢(xún)提供的數(shù)據(jù)作出相應(yīng)反應(yīng)。典塑的主設(shè)備:主機(jī)和可編程儀表。典型的從設(shè) 備:可編程控制器。主設(shè)備可單獨(dú)和從設(shè)備通信,也能以廣播方式和所有從設(shè)備通信。如果單獨(dú)通信,從設(shè)備返回一消 息作為冋應(yīng),如果是以廣播方式查詢(xún)的,則不作任何回應(yīng)。modbus協(xié)議建立了主設(shè)備查詢(xún)的格式:設(shè)備(或廣播)
5、地址、 功能代碼、所有要發(fā)送的數(shù)據(jù)、一錯(cuò)謀檢測(cè)域。從設(shè)備冋應(yīng)消息也由modbus協(xié)議構(gòu)成,包括確認(rèn)要行動(dòng)的域、任何 要返回的數(shù)據(jù)、和一錯(cuò)誤檢測(cè)域。如果在消息接收過(guò)程中發(fā)牛一錯(cuò)誤,或從設(shè)備不能執(zhí)行其命令,從設(shè)備將建立一錯(cuò)誤消息并 把它作為回應(yīng)發(fā)送出去。2、在其它類(lèi)型網(wǎng)絡(luò)上轉(zhuǎn)輸在其它網(wǎng)絡(luò)上,控制器使用對(duì)等技術(shù)通信,故任何控制都能初始和其它控制器的通信。這樣在單獨(dú)的通信過(guò)程中,控制器既可作為主設(shè)備也可作為從設(shè)備。提供的多個(gè)內(nèi)部通道可允許同時(shí)發(fā)生的傳輸進(jìn)程。在消 息位,modbus協(xié)議仍提供了主一從原則,盡管網(wǎng)絡(luò)通信方法是“對(duì)等”。如果一控制器發(fā)送一消息,它只是作為主設(shè)備, 并期望從從設(shè)備得到冋應(yīng)。同
6、樣,當(dāng)控制器接收到一消息,它將建立一從設(shè)備冋應(yīng)格式并返冋給發(fā)送的控制器。3、查詢(xún)一回應(yīng)周期(1) 、査詢(xún)查詢(xún)消息中的功能代碼告z被選中的從設(shè)備要執(zhí)行何種功能。數(shù)據(jù)段包含了從設(shè)備要執(zhí) 行功能的任何附加信息。例如功能代碼03是要求從設(shè)備讀保持寄存器并返冋它們的內(nèi)容。數(shù)據(jù)段必須包含要告之從設(shè) 備的信息:從何寄存器開(kāi)始讀及要讀的寄存器數(shù)量。錯(cuò)誤檢測(cè)域?yàn)閺脑O(shè)備提供了一種驗(yàn)證消息內(nèi)容是否正確的方法。(2) 、回應(yīng)如果從設(shè)備產(chǎn)生一止常的回應(yīng),在回應(yīng)消息中的功能代碼是在查詢(xún)消息中的功能代碼的 冋應(yīng)。數(shù)據(jù)段包括了從設(shè)備收集的數(shù)據(jù):象寄存器值或狀態(tài)。如果有錯(cuò)誤發(fā)生,功能代碼將被修改以用于指岀回應(yīng)消息 是錯(cuò)謀的,同
7、時(shí)數(shù)據(jù)段包禽了描述此錯(cuò)誤信息的代碼。錯(cuò)誤檢測(cè)域允許主設(shè)備確認(rèn)消息內(nèi)容是否可用。3、兩種傳輸方式控制器能設(shè)置為兩種傳輸模式(ascii或rtu)屮的任何一種在標(biāo)準(zhǔn)的modbus網(wǎng)絡(luò)通信。 用戶(hù)選擇想要的模式,包括串口通信參數(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ò),它定義了在這
8、些網(wǎng)絡(luò)上連續(xù)傳 輸?shù)南⒍蔚拿恳晃?,以及決定怎樣將信息打包成消息域和如何解碼。在其它網(wǎng)絡(luò)上(象map和modbus plus)modbus消 息被轉(zhuǎn)成與串行傳輸無(wú)關(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ù)
9、據(jù)位,最小的有效位先發(fā)送1個(gè)奇偶校驗(yàn)位,無(wú)校驗(yàn)則無(wú)1個(gè)停止位(有校驗(yàn)時(shí)),2個(gè)bit(無(wú)校驗(yàn)時(shí))錯(cuò)誤檢測(cè)域crc(循環(huán)冗長(zhǎng)檢測(cè))地址域消息幀的地址域包含8bit(rtu)o可能的從設(shè)備地址是0.247什進(jìn)制)。單個(gè)設(shè)備的地址 范圍是仁.247。主設(shè)備通過(guò)將要聯(lián)絡(luò)的從設(shè)備的地址放入消息中的地址域來(lái)選通從設(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ò)傳
10、輸模式,這町以是由 一 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è)備寫(xiě)一組從設(shè)備的寄存器(功能代碼10十六進(jìn) 制),數(shù)據(jù)域則指明了要寫(xiě)的起始寄存器以及耍寫(xiě)的寄存器數(shù)量,數(shù)據(jù)域的數(shù)據(jù)字節(jié)數(shù),要另入寄存器的數(shù)據(jù)。如果沒(méi)有錯(cuò)誤發(fā) 生,從從設(shè)備返回的數(shù)據(jù)域包含請(qǐng)求的數(shù)據(jù)。如果有錯(cuò)謀發(fā)生,此域包含一異議代碼,主設(shè)備應(yīng)用程序可以用來(lái)判斷采取下 一步行動(dòng)。在某種消
11、息屮數(shù)據(jù)域可以是不存在的(0長(zhǎng)度)。例如,主設(shè)備要求從設(shè)備回應(yīng)通信事件記錄(功能代碼0b十六進(jìn) 制),從設(shè)備不需任何附加的信息。三、dll函數(shù)說(shuō)明modbus.dll是王俊于2007年最新開(kāi)發(fā)的基于施耐得modbus rtu通訊協(xié)議的串口通訊鏈 接庫(kù)。modbus.dll專(zhuān)業(yè)版實(shí)現(xiàn)了對(duì)保持寄存器400014xxxx區(qū)數(shù)據(jù)讀寫(xiě)(fcn03:讀、 fcn16:寫(xiě),fcn06寫(xiě)單個(gè)數(shù)據(jù));對(duì)邏輯線(xiàn)圈000010xxxx的讀寫(xiě)(fcn01:讀取一組 線(xiàn)圈,fcn05:強(qiáng)置單線(xiàn)圈,fcn15強(qiáng)直多線(xiàn)圈):對(duì)輸入狀態(tài)100011xxxx的讀(fcn02); 対輸入寄存器300013xxxx的讀(fcn04
12、)。dll中的主要函數(shù):comopen:打開(kāi)串口comclose:關(guān)閉串 口fcn01:讀取一組線(xiàn)圈(00001 0xxxx)fcn02:取得一組開(kāi)關(guān)輸入狀態(tài)數(shù)據(jù)(100011xxxx)fcn03:讀多個(gè)保持寄存器數(shù)據(jù)(400014xxxx)fcn04:讀多個(gè)輸入寄存器數(shù)據(jù)(300013xxxx)fcn05s:置位單線(xiàn)圈(00001 0xxxx)fcn05r:復(fù)位單線(xiàn)圈(00001 0xxxx)fcn06:預(yù)直單保持寄存器數(shù)據(jù)(400014xxxx)fcn15:強(qiáng)置多線(xiàn)圈的通斷數(shù)據(jù)(000010xxxx)fcn16:寫(xiě)多個(gè)保持寄存器數(shù)據(jù)(400014xxxx)fcn16_xset:?jiǎn)伪3旨拇嫫?/p>
13、的015相應(yīng)位的置位(40001.0-40001.154xxxx.0 4xxxx.15)fcn16_xreset:?jiǎn)伪3旨拇嫫鞯?15相應(yīng)位的復(fù)位(40001.0-40001.154xxxx.0 -4xxxx.15)fcn16_xsetreset:單保持寄存器的015相應(yīng)位的置復(fù)位(40001.0-40001.15 4xxxx.0-4xxxx.15),指使相應(yīng)的位短時(shí)間通斷一次(約通60ms)comtrue:讀取dll中的串口是否備有效打開(kāi)cinbin:字中相應(yīng)的位的狀態(tài)抽取1、打開(kāi)串口function comopen(nport,baudrate,databits,parity,stopbi
14、tsjongint;user:pchar):longint; stdcall;參數(shù):nport:打開(kāi)串口號(hào),取值為18,代農(nóng)com1com8;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)用戶(hù)名;返回值:長(zhǎng)整型,操作成功返回“
15、1”或“2”; 1表示注冊(cè)授權(quán)用戶(hù),2表示用戶(hù)未注冊(cè);操作不成功返冋為“0”時(shí)的原因:1)、串口不存在或被占用;2)、dll注冊(cè)授權(quán)不正確。注:本dll用戶(hù)不注冊(cè)除了下面說(shuō)明的功能限制外沒(méi)冇其他限制,未注冊(cè)用戶(hù)請(qǐng)使用特定 用戶(hù)名:wangjurio注冊(cè)用戶(hù)功能上無(wú)任何限制,r將得到永久的軟件使用和更新升級(jí)服務(wù); 使用舉例:delphi: comopen(1,9600,8,*l,1,pchar('wangjurt),打開(kāi) c0m1 口。vb: comopen(1,9600,8,1,1 ,mwangjunh),打開(kāi) com1 口。(注:下面的示例都以 vb 調(diào)用 形式給出)2、關(guān)閉串口fu
16、nction comclose(nport:longint):longint;stdcall;參數(shù):nport:串口號(hào),取值為1& 代農(nóng)com1com8;返回值:氏整型,操作成功返回“1”,否則返回“0”;使用舉例:comclose(1),關(guān)閉打開(kāi)的 com1 口。3、modbus相應(yīng)功能碼所對(duì)應(yīng)的讀取功能函數(shù)。1) 、01功能碼位元件的讀取(讀取一組線(xiàn)圈)functi on fcn01 (n port, no de,address,c oun t:longi nt):pchar;stdcall;參數(shù):nport:串口號(hào),取值為18,代表com1com8;node: modbus從站號(hào)
17、,取值1255;address:元件地址,取值范圍從000010xxxx地址區(qū)(邏輯線(xiàn)圈)值(你要讀標(biāo)準(zhǔn)modbus 的00001地址這個(gè)值為0000,依次類(lèi)推)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)從站 0002000056(標(biāo)準(zhǔn) modbus 地址)的 位狀態(tài)值,返回值為“cd6bb20e1b”則表示 2720:cd, 352&6b, 4336:b2, 5144:0e, 56-52:1 b;字節(jié)值為實(shí)際的位狀態(tài)值
18、對(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ò)謀或不能讀取的情況下返冋“erro
19、r”注:沒(méi)有注冊(cè)的用戶(hù)只能讀取0000100006范圍的狀態(tài)值;2)、02功能碼位元件的讀?。ㄈ〉靡唤M開(kāi)關(guān)輸入狀態(tài)數(shù)據(jù))functi on fcn02( nport, no de,address,c oun t:longi nt):pchar;stdcall;參數(shù):nport:串口號(hào),取值為18,代表com1com&node: modbus從站號(hào),取值1255;address:元件地址,取值范圍從10001-1xxxx地址區(qū)(開(kāi)關(guān)輸入狀態(tài))值(你要讀標(biāo)準(zhǔn) modbus的10001地址這個(gè)值為0000,依次類(lèi)推)count:讀取的位元件個(gè)數(shù),一次最多讀取1000個(gè)但不能超出尋址范圍;返冋
20、值:16進(jìn)制字符串?dāng)?shù)據(jù),字符串?dāng)?shù)據(jù)的終止符為“”;使用舉例:fcn02(1,1,196,22),|il com1 讀取 modbus 1 號(hào)從站 1019710218(標(biāo)準(zhǔn) modbus 地址)的 位狀態(tài)值,返冋值為“acdb35”則表示 10204-10197:ac, 10212-10205:db, 10218-10213:35;在讀取錯(cuò)誤或不能讀取的情況f返回“error”注:沒(méi)有注冊(cè)的用戶(hù)只能讀取1000110006范圍的狀態(tài)值;3)、03功能碼字元件的讀?。ㄗx多個(gè)保持寄存器數(shù)據(jù))function fcn03(nport,node,address,count:longint):pchar
21、;stdcall;參數(shù):nport:串口號(hào),取值為18,代表com1com&node: modbus從站號(hào),取值1255;address:元件地址,取值范圍從400014xxxx地址區(qū)(保持寄存器數(shù)據(jù))值(你要讀標(biāo)準(zhǔn) modbus的40001地址這個(gè)值為0000,依次類(lèi)推)count:讀取的位元件個(gè)數(shù),一次最多讀取60個(gè)但不能超出尋址范圍;返回值:16進(jìn)制字符串?dāng)?shù)據(jù),字符串?dāng)?shù)據(jù)的終止符為”;使用舉例:fcn03(1,1,107,3),lllcom1 讀取 m odbus 1 號(hào)從站 40108 40110(標(biāo)準(zhǔn) m odbus 地址)的字 狀態(tài)值,返冋值為“022b00000064”則
22、表示 40108:022b, 40109:0000, 40110:0064;在讀取錯(cuò)誤或不能讀取的情況下返冋“error”注:沒(méi)有注冊(cè)的用戶(hù)只能m 4000140003范圍的狀態(tài)值;4)、04功能碼字元件的讀?。ㄗx多個(gè)輸入寄存器數(shù)據(jù))fun ction fcn04(n port, no de,address,c ount:longin t):pchar;stdcall;參數(shù):nport:串口號(hào),取值為18,代表com1com8;node: modbus從站號(hào),取值1255;address:元件地址,取值范圍從30001-3xxxx地址區(qū)(輸入寄存器數(shù)據(jù))值(你要讀標(biāo)準(zhǔn) modbus的30001
23、地址這個(gè)值為0000,依次類(lèi)推)count:讀取的位元件個(gè)數(shù),一次最多讀取60個(gè)但不能超出尋址范圍;返i叫值:16進(jìn)制字符吊數(shù)據(jù),字符串?dāng)?shù)據(jù)的終止符為“”;使用舉例:fcn04(1517,8,1),rhcom1 讀取 modbus 17 號(hào)從站 30009(標(biāo)準(zhǔn) modbus 地址)的字狀態(tài)值, 返冋值為“000a”則表示 30009:000a;在讀取錯(cuò)謀或不能讀取的情況下返冋“error”注:沒(méi)有注冊(cè)的用戶(hù)只能讀取3000130003范圍的狀態(tài)值;4、modbus相應(yīng)功能碼所對(duì)應(yīng)的寫(xiě)入功能函數(shù)1)、05功能碼線(xiàn)圈的置復(fù)位功能函數(shù)1、線(xiàn)圈置位functio n fcn05s( nport, n
24、o de,address:! ongint):longin t;stdcall;參數(shù):nport:串口號(hào),取值為18,代表com1com8;node: modbus從站號(hào),取值1255;address:元件地址,収值范圍從000010xxxx地址區(qū)(邏輯線(xiàn)圈)值(你耍寫(xiě)標(biāo)準(zhǔn)modbus 的00001地址這個(gè)值為0000,依次類(lèi)推)返回值:長(zhǎng)整數(shù),操作成功返回1,不能寫(xiě)入或操作錯(cuò)誤返回0;使用舉例:fcn05s(1,12,15),由com1將modbus 12號(hào)從站00013(標(biāo)準(zhǔn)modbus地址)的位狀態(tài)值置1, 返回值為1表示成功注:沒(méi)有注冊(cè)的用戶(hù)只能寫(xiě)入0000100006范圍的狀態(tài)值;2
25、、線(xiàn)圈復(fù)位function fcn05r(nport,node,address:longint):longint;stdcall;參數(shù):nport:串口號(hào),取值為18,代表com1com8;node: modbus從站號(hào),取值1255;address:元件地址,取值范圍從00001 0xxxx地址區(qū)(邏輯線(xiàn)圈)值(你要寫(xiě)標(biāo)準(zhǔn)modbus 的00001地址這個(gè)值為0000,依次類(lèi)推)返冋值:長(zhǎng)整數(shù),操作成功返冋1,不能寫(xiě)入或操作錯(cuò)課返冋0;使用舉例:fcn05r(1,12,15),由com1將modbus 12號(hào)從站00013(標(biāo)準(zhǔn)modbus地址)的位狀態(tài)值置0,返回值為1表示成功注:沒(méi)冇注冊(cè)
26、的用戶(hù)只能寫(xiě)入0000100006范圍的狀態(tài)值;2)、06功能碼預(yù)置單保持寄存器數(shù)據(jù)功能函數(shù)function fcn06(nport,node,address:longint;sendstr:pchar):longint;stdcall;參數(shù):nport:串口號(hào),取值為18,代表com1com&node: modbus從站號(hào),取值1255;address:元件地址,取ffi范圍從40001 4xxxx地址區(qū)(保持寄存器)值(你耍寫(xiě)標(biāo)準(zhǔn)modbus 的40001地址這個(gè)值為0000,依次類(lèi)推)sendstr:寫(xiě)入字值,該值為4個(gè)一組的16進(jìn)制字符串組成其取值為0000ffff(整數(shù)值為
27、0 65535);返回值:長(zhǎng)整數(shù),操作成功返回1,不能寫(xiě)入或操作錯(cuò)誤返回0;當(dāng)要寫(xiě)入字值時(shí)依次排列即可。如給40001寫(xiě)值1000,先將1000轉(zhuǎn)成16進(jìn)制字符串03e& 則 sendstr=03e8;使用舉例:fcn06(1,2,2,”03e8“),由 c0m1 給 modbus 2 號(hào)從站 40003(標(biāo)準(zhǔn) modbus 地址)的字單元寫(xiě) 入1000(16進(jìn)制03e8),返回值為1表示成功注:沒(méi)有注冊(cè)的用戶(hù)只能寫(xiě)入4000140003范圍的狀態(tài)值;(00001 0xxxx)3)、15功能碼強(qiáng)置多線(xiàn)圈的通斷數(shù)據(jù)功能函數(shù)function fcn15( nport, no de,addr
28、ess,c ount:longint;sen dstr:pchar):l origin t;stdcall;參數(shù):nport:串口號(hào),取值為18,代表com1com8;node: modbus從站號(hào),取值1255;address:元件地址,取值范圍從00001 0xxxx地址區(qū)(邏輯線(xiàn)圈)值(你要寫(xiě)標(biāo)準(zhǔn)modbus 的00001地址這個(gè)值為0000,依次類(lèi)推)count:寫(xiě)入位元件個(gè)數(shù),一次最多1000個(gè)但不能超出尋址范圍;sendstr:給位元件寫(xiě)入的值按8個(gè)為一組和成字節(jié)值在寫(xiě)入,該值為2個(gè)一組的16進(jìn)制字 符串組其取值為00ff(整數(shù)值為0255);返冋值:長(zhǎng)整數(shù),操作成功返冋1,不能寫(xiě)
29、入或操作錯(cuò)謀返冋0; 寫(xiě)字符串序列如:|00|ff|10|64| 08 | 04 | 實(shí)際字符串與位地址的數(shù)值應(yīng)如下農(nó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,)j 由 c0m1 給 modbus 2 號(hào)從站 00020-00029(標(biāo)準(zhǔn) modbus 地 址
30、)10個(gè)位單元寫(xiě)如相應(yīng)值,返回值為1表示成功寫(xiě)入值的參考2720: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è)的用戶(hù)只能寫(xiě)入0000100006范圍的狀態(tài)值;4)、16功能碼寫(xiě)多個(gè)保持寄存器數(shù)據(jù)功能函數(shù)function fcn16(nport,node,address,count:longint;sendstr:pchar):longint;stdca
31、ll;參數(shù):nport:串口號(hào),取值為18,代表com1com&node: modbus 從站號(hào),収值 1 255;address:元件地址,取值范圍從40001 4xxxx地址區(qū)(保持寄存器)值(你要寫(xiě)標(biāo)準(zhǔn)modbus 的40001地址這個(gè)值為0000,依次類(lèi)推)count:寫(xiě)入字元件個(gè)數(shù),-次最多60個(gè)但不能超出尋址范圍;sendstr:給字寫(xiě)入的值,該值為4個(gè)一組的16進(jìn)制字符串組其取值為0000ffff(整數(shù)值 為 065535);返冋值:長(zhǎng)整數(shù),操作成功返回1,不能寫(xiě)入或操作錯(cuò)課返冋0;當(dāng)要寫(xiě)入多個(gè)字值時(shí)依次排列即可。如給40001與40002寫(xiě)值100和1000,先將100
32、轉(zhuǎn)成16進(jìn)制字符串0064、1000轉(zhuǎn)成16進(jìn)制字符串03e8,則sendstr=006403e8; 次最多寫(xiě)64個(gè)字即字符串長(zhǎng)應(yīng)小于等于256; 寫(xiě)字符串序列如:| 0064 | 03e8 | 0010 | 6004 | | 0008 | 0400 |1 1 1 1 1 1 1 1 使用舉例:fcn16(1,2,1,”000a0102"),由 com1 給 modbus 2 號(hào)從站 40002(標(biāo)準(zhǔn) modbus 地址)的字單 元寫(xiě)入給10(16進(jìn)制000a)、40003(標(biāo)準(zhǔn)modbus地址)的字單元寫(xiě)入給258(16進(jìn)制0102)返回值為1表示成功;注:沒(méi)有注冊(cè)的用戶(hù)只能寫(xiě)入4
33、000140003范圍的狀態(tài)值;5)、modbus功能碼16的擴(kuò)展功能函數(shù)1、單保持寄存器的015相應(yīng)位的置位(40001.0-40001.154xxxx.04xxxx.15)fun ction fcn16_xset( nport, no de,address,bit:l on gint):l on gint;stdcall;參數(shù):nport:串口號(hào),取值為18,代表com1com8;node: modbus從站號(hào),取值1255;address:元件地址,取值范圍從40001-4xxxx地址區(qū)(保持寄存器)值(你要寫(xiě)標(biāo)準(zhǔn)modbus 的40001地址這個(gè)值為4000,依次類(lèi)推)bit:保持寄存
34、器的位,取值015;返回值:長(zhǎng)整數(shù),操作成功返回1,不能寫(xiě)入或操作錯(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è)的川戶(hù)不能使川木功能;2、單保持寄存器的015相應(yīng)位的復(fù)位(40001.0-40001.154xxxx.0 4xxxx.15)fun ction fcn16_xreset(nport, no de,address,bit:l ongin t):longint;stdcall;參數(shù):nport:串口號(hào),取值為18,代表c0m1c
35、0m8;node: modbus從站號(hào),取值1255;address:元件地址,取值范圍從40001-4xxxx地址區(qū)(保持寄存器)值(你要寫(xiě)標(biāo)準(zhǔn)modbus 的40001地址這個(gè)值為4000,依次類(lèi)推)bit:保持寄存器的位,取值015;返回值:長(zhǎng)整數(shù),操作成功返回1,不能寫(xiě)入或操作錯(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è)的川戶(hù)不能使川木功能;3、單保持寄存器的015相應(yīng)位的置復(fù)位(40001.0-40001.15-4xxx
36、x.0- 4xxxx.15)指使相應(yīng)的位短時(shí)間通斷一次(接通約60ms)function fcn16_xsetreset(nport,node,address,bit:longint):longint;stdcall;參數(shù):nport:串口號(hào),取值為18,代表com1com8;node: modbus從站號(hào),取值1255;address:元件地址,取值范圍從40001 4xxxx地址區(qū)(保持寄存器)值(你要寫(xiě)標(biāo)準(zhǔn)modbus 的40001地址這個(gè)值為4000,依次類(lèi)推)bit:保持寄存器的位,取值015;返回值:長(zhǎng)整數(shù),操作成功返回1,不能寫(xiě)入或操作錯(cuò)誤返回0;使用舉例:fcn16_xsetr
37、eset(1,10,9,10),rh 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è)用戶(hù)沒(méi)冇限制,完全可以使用。)1、串口打開(kāi)狀態(tài)的讀取function comtrue(nport:longint):longint;stdcall;參數(shù):noprt: $ 口號(hào),取值為18,代表c0m1c0m8;返回值:長(zhǎng)整型,串口成功打開(kāi)返回“1”,否則返回“0”;這里讀取是dll有效取得了串口的控制權(quán),如果其他程序占用(串口不存在)等原因仍返
38、回“0”。2、整數(shù)轉(zhuǎn)換成16進(jìn)制字符串(為vc等非rad開(kāi)發(fā)環(huán)境所增設(shè))function clnttohex(dcint,digits:longint):pchar;stdcall;參數(shù):cint:待轉(zhuǎn)換整數(shù),取值為(065535);digits:轉(zhuǎn)換的字符串位數(shù),指定位數(shù)小于實(shí)際位數(shù)時(shí)按實(shí)際輸出;在參數(shù)錯(cuò)誤等非法的情況下返冋“eor”使用舉例:clnttohex(200,2),則返回字符串 “c8”;clnttohex(200,4),則返回字符串 “00c8 ”;clnttohex(200,8),w'j 返冋字符串 “000000c8 ”;clnttohex(4500,4),則返回字
39、符串 “1194 ”;clnttohex(4500,3),則返回字符串“1194”,因?yàn)椤?94”不足以表示4500這個(gè)數(shù)所以按實(shí)際 輸出字符串“1194 ”;” ”為字符串?dāng)?shù)據(jù)的終止符。3、16進(jìn)制字符串轉(zhuǎn)換成整數(shù)(為vc等非rad開(kāi)發(fā)環(huán)境所增設(shè))function chextolnt(chex:pchar):longint;stdcall;參數(shù):chex:待轉(zhuǎn)換字符串,取值為(0000ffff);使川舉例:chextolnt(”03e8"),則返回整數(shù) 1000;注:在參數(shù)不止確等出錯(cuò)情況下返回值為4、抽取(065535)所示整數(shù)中(015)某個(gè)位的值function cinbin
40、(chex,start:longint):longint;stdcall;參數(shù):chex:待轉(zhuǎn)換整數(shù),取值為065535(0000ffff);start:抽収的位,取值為(015);使用舉例:cinbin(15,3),則返回值cinbin(15,4),則返回值 0;cinbin(1000,6),返冋值 1;讀取mb0組合成的字節(jié)值為“fc”(252)時(shí),要讀取m0.1的值時(shí),則調(diào)用cinbin(252,1)jg回 值0表示m0.1的值為0。注:在參數(shù)不正確等出錯(cuò)情況卜返回值為“1”。5、返回字符串text左邊的count個(gè)字符(為vc等非rad開(kāi)發(fā)環(huán)境所增設(shè))function cleftstr
41、(text:pchar;count:longint):pchar;stdcall;參數(shù):text:字符串原型;count:指定返冋左側(cè)字符串個(gè)數(shù);在參數(shù)錯(cuò)謀等非法的情況下返冋“error” 使用舉例:cleftstr(m123456°, 3) = ”123”;” ”為字符串?dāng)?shù)據(jù)的終止符。6、返冋字符串text右邊的count個(gè)字符(為vc等非rad開(kāi)發(fā)環(huán)境所增設(shè))function crightstr(text:pchar;count:longint):pchar;stdcall;參數(shù):text:字符串原型;count:指定返回右側(cè)字符串個(gè)數(shù)在參數(shù)錯(cuò)謀等非法的情況下返冋“eiror”使
42、用舉例:crightstr(h123456", 3) = “456”;” ”為字符串?dāng)?shù)據(jù)的終止符o7、返回字符串text從start開(kāi)始的count個(gè)字符(為vc等非rad開(kāi)發(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開(kāi)始于字
43、符串ostr的位直(為vc等非rad開(kāi)發(fā)環(huán)境所增設(shè))function cinstr(ostr,ckstr:pchar;dcint:longint):longint;stdcall;參數(shù):ostr:字符申原型;cstr:查詢(xún)的字符串;dcint:設(shè)定査詢(xún)字符串的起始位置,収值9川卩最少?gòu)脑醋址捏室粋€(gè)字符開(kāi)始查詢(xún);返回值:長(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)整型;
44、返回值:長(zhǎng)整型,操作成功返回“1”,否則返回“0”。使用舉例:mybeep(2000);按2000的頻率發(fā)出報(bào)警聲。dll中關(guān)丁傳出字符串值的函數(shù)都以”為字符串函數(shù)值終止符,這是對(duì)多開(kāi)發(fā)環(huán)境應(yīng)用時(shí) 方便用戶(hù)止確讀取返回字符串?dāng)?shù)據(jù)而設(shè)。五、delphi. vb、vc語(yǔ)言環(huán)境的開(kāi)發(fā)使用說(shuō)明1、delphi語(yǔ)言環(huán)境開(kāi)發(fā)說(shuō)明在delphi環(huán)境下將modbus.dll、serialmodbus.slip(許可文件)復(fù)制到應(yīng)用程序目錄下(即將上述文件與編譯后的可執(zhí)行文件方入同一文件內(nèi));在工程文件的主程序窗體(pas)文件中聲明:function comopen(nport,baudrate,databi
45、ts,parity,stopbits:longint;user:pchar):longint;stdcall;externa i'm odbus.dir;function comclose(nport:longint):longint;stdcall;externarmodbus.dir;fun ction fcn01(n port, no de,address,c ount:lon gint):pchar;stdcall;externarmodbus.dir;function fcn02(nport,node,address,count:longint):pchar;stdcall;
46、externarmodbus.dir;function fcn03(nport,node,address,count:longint):pchar;stdcall;externarmodbus.dir;function fcn04(nport,node,address,count:longint):pchar;stdcall;externarmodbus.dir;function fcn05s(nport,node,address:longint):longint;stdcall;externaodbus.dll:function fcn05r(nport,node,address:lorig
47、int):longint;stdcall;externarmodbus.dll:function fcn06(nport,node,address:longint;sendstr:pchar):longint;stdcall;externarmod bus.dir;fun ction fcn15(nport, no de,address,count:longint;se ndstr:pchar):longi nt;stdcall;exter n al1 modbus.dir;fun ction fcn16(nport, no de,address,c ount:lon gint;se ndst
48、r:pchar):longint;stdcall;exter n modbus.dir;function fcn16_xset(nport,node,address,bit:longint):longint;stdcall;externarmodbus.dl r;function fcn16_xreset(nport,node,address,bit:longint):longint;stdcall;externai'modbus .dir;function fcn16_xsetreset(nport,node5address,bit:longint):longint;stdcall;
49、external'mod bus.dir;function comtrue(nport:longint):longint;stdcall;externai'modbus.dir;function mybeep(soundhz:longint):longint;stdcall;external'modbusd;其它附加函數(shù)delphi有實(shí)用函數(shù),建議用delphi 口帶函數(shù),如需使用聲明參照上例;注:所有dll的函數(shù)必須聲明方能使用,建議本dll的聲明采用示例所示的靜態(tài)聲明方 式。聲明后可以在程序中使用這些函數(shù),附加函數(shù)中除comtrue> cinbin、mybee
50、p等delphi系統(tǒng)自帶有類(lèi)似功能函數(shù)。通信時(shí)必須先使丿ijcomopen函數(shù)打開(kāi)串口,在串口打開(kāi)后可以?xún)有Р僮飨嚓P(guān)函數(shù),為確保通信可在程序運(yùn)行開(kāi)始吋打開(kāi)串口,程序退出前關(guān)閉串口。應(yīng)用程序退出 之前請(qǐng)務(wù)必將關(guān)閉所有串【i,如串口沒(méi)有關(guān)閉而退出程序?qū)伋霎惓ee(cuò)誤。確保應(yīng)用程序在關(guān)閉釋放前關(guān)閉打開(kāi)的串口。解決方法,在form的ondestroy事件中加入 如下語(yǔ)句:for i:=1 to 8 dobeginif comtrue(i)=1 then comclose(i);end;在delphi中給中給dll中的函數(shù)傳pchar值問(wèn)題,建議string型轉(zhuǎn)換到pchar型采用 strpcopy()函
51、數(shù),pchar型轉(zhuǎn)換到string型采用straps()函數(shù),不推薦使用直接轉(zhuǎn)換法即string到pchar類(lèi)型采用mpchar=pchar(str), pchar到string采 用 str:=mpchar (str 為 string 類(lèi)型、mpchar 為 pchar類(lèi)型)。上述可以詳細(xì)參照demo程序。2、vb語(yǔ)言環(huán)境開(kāi)發(fā)說(shuō)明在vb環(huán)境下將modbus.dlk serialmodbus.slip(許可文件)復(fù)制到應(yīng)用程序目錄下(即將上述 文件與編譯后的町執(zhí)行文件方入同一文件夾內(nèi));函數(shù)說(shuō)明中給出的是delphi的函數(shù)原型,在vb中聲明時(shí)只要注意一下類(lèi)型的對(duì)應(yīng)即nj delphi中的lon
52、gint類(lèi)型對(duì)應(yīng)vb中的long類(lèi)型、delphi屮的pchar對(duì)應(yīng)vb屮的string類(lèi)型,下面給出主要函數(shù)的聲明:private declare function comopen lib ,lmodbus.diri (byvai nport as long, byvai baudr ate as long, byvai databits as long, byvai parity as long, byvai stopbits as long, byv al user as string) as longprivate declare function comclose lib “modb
53、us.dll” (byvai nport as long) as long private declare function fcn01 lib hmodbus.dhh (byvai nport as long, byvai node as l ong, byvai address as long, byvai count as long) as stringprivate declare function fcn02 lib "modbus.dh" (byvai nport as long, byvai node as l ong, byvai address as lo
54、ng, byvai count as long) as stringprivate declare function fcn03 lib "modbus.dll" (byvai nport as long, byvai node as l ong, byvai address as long, byvai count as long) as stringprivate declare function fcn04 lib ,lmodbus.dllfl (byvai nport as long, byvai node as l ong, byvai address as lo
55、ng, byvai count as long) as stringprivate declare function fcn05s lib "modbus.dll" (byvai nport as long, byvai node as long, byvai address as long) as longprivate declare function fcn05r lib ,lmodbus.dhh (byvai nport as long, byvai node as long, byvai address as long) as longprivate declar
56、e function fcn06 lib "modbus.dh" (byvai nport as long, byvai node as l ong, byvai address as long, byvai sendstr as string) as longprivate declare function fcn15 lib hmodbus.dllh (byvai nport as long, byvai node as l ong, byvai address as long, byvai count as long, byvai sendstr as string) as long private declare function fcn16 lib "modbus.dir' (byvai nport as long, byvai node as l ong, byvai address as long, byvai count as long, byvai sendstr as string) as long private declare function fcn16_xset lib "modbus.dll” (byvai nport as long, byvai n
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 勞務(wù)合同兼職合同范本
- 分包制作安裝合同范本
- 借款車(chē)位轉(zhuǎn)讓合同范本
- 代理房屋合同范本
- 2024年玉環(huán)市委辦公室選聘考試真題
- 2024年舟山市定海區(qū)人民檢察院招聘用工人員筆試真題
- 關(guān)于電纜合同范本
- 2024年玉林市第十一中學(xué)招聘高中體育頂崗教師筆試真題
- 個(gè)人經(jīng)營(yíng)服務(wù)合同范本
- 借款房屋轉(zhuǎn)讓合同范本
- DL-T439-2018火力發(fā)電廠(chǎng)高溫緊固件技術(shù)導(dǎo)則
- 2024年湖南電氣職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫(kù)附答案
- 幼兒園衛(wèi)生保健工作匯報(bào)
- (正式版)JBT 14787-2024 可同步限矩型液力耦合器
- 合規(guī)管理體系實(shí)務(wù)培訓(xùn)測(cè)試題附有答案
- 常見(jiàn)癥狀-黃疸課件
- 民主(組織)生活會(huì)批評(píng)和自我批評(píng)示例31個(gè)
- 節(jié)后復(fù)工安全培訓(xùn)的事故案例分析與教訓(xùn)
- 五子棋基礎(chǔ)入門(mén)課件
- 課程思政融入專(zhuān)業(yè)課程的
- 涉密人員專(zhuān)題培訓(xùn)課件
評(píng)論
0/150
提交評(píng)論