當前位置:首頁 » 操作系統 » cmodbus源碼

cmodbus源碼

發布時間: 2022-07-11 23:29:54

❶ 工程上用到了MODBUS tcp 通訊,原來用過MODBUS RTU的協議,不知道他們的主要區別,或者誰有相應的源代碼

Modbus rtu和Modbus tcp兩個協議的本質都是MODBUS協議,都是靠MODBUS寄存器地址來交換數據;
但所用的硬體介面不一樣,Modbus
RTU一般採用串口RS232C或RS485/422,而Modbus TCP一般採用乙太網口。
現在市場上有很多協議轉換器,可以輕松的將這些不同的協議相互轉換 如:Intesisbox可以把modbus rtu轉換成Modbus
tcp實際上Modbus協議包括ASCII、RTU、TCP。
標準的Modicon控制器使用RS232C實現串列的Modbus。Modbus的ASCII、RTU協議規定了消息、數據的結構、命令和就答的方式,數據通訊採用Maser/Slave方式。
Modbus協議需要對數據進行校驗,串列協議中除有奇偶校驗外,ASCII模式採用LRC校驗,RTU模式採用16位CRC校驗.
ModbusTCP模式沒有額外規定校驗,因為TCP協議是一個面向連接的可靠協議。
TCP和RTU協議非常類似,只要把RTU協議的兩個位元組的校驗碼去掉,然後在RTU協議的開始加上5個0和一個6並通過TCP/IP網路協議發送出去即可。

❷ 求c語言編程的Modbus TCP源代碼

從機的可以用freemodbus,我用過RTU的,很好用。
TCP的沒用過,但freemodbus的代碼格式很清晰,移植起來很簡單。
http://www.modbus.org/tech.php
另外可以去MODBUS的網站上找找,看有沒有合適的庫可以用。

❸ 組態軟體國內那家做的好推薦幾個比較一下

國內組態軟體大一點的分為四家:紫金橋RealHistorian、亞控組態王KingScada、力控ForceControl7.2 SP1、傑控FaMe。主要分析他們幾個的優缺點,如下:

  1. 設備驅動:紫金橋RealHistorian常用硬體種類常用型號支持

    亞控組態王KingScada種類非常多,支持大量硬體型號

    力控ForceControl7.2 SP1種類比較多,支持常用驅動和部分匯流排;功能相對比較全(modbus驅動,可以控制起始地址,數據長度,校驗高低位互換!可以很容易實現非標設備鏈接!)

    傑控FaMe主要集中在主要的幾家國外廠家和網關等相關設備范圍比較小

  2. 歷史存儲:紫金橋RealHistorian.周期和變化保存兩種方式

    亞控組態王KingScada.無

    力控ForceControl7.2 SP1.周期和變化保存兩種方式和數據插入模式(條件保存)

    傑控FaMe.無

  3. 點類型:紫金橋RealHistorian.內置多種點類型(模擬點、數字點、組合點、設備運行點、運算點等)

    亞控組態王KingScada.IO離散,IO長整型,IO整型,IO實型,IO雙精度浮點,IO字元串

    力控ForceControl7.2 SP1.模擬、數字、累計、控制、運算、組合和雪崩過濾點等7種類型(建點那裡,可以批量點鏈接,不同節點下,點名可以重名)

    傑控FaMe.無

  4. 關系庫通訊:紫金橋RealHistorian.支持多種關系資料庫,包括Oracle、sql Server、Access、mysql、sqlite。 支持一些國產的關系庫例如:人大金倉,達夢

    亞控組態王KingScada.無

    力控ForceControl7.2 SP1.通過ADO,可以和所有的關系型資料庫通信,但是配置比較繁瑣。具體沒測試。

    傑控FaMe.通過ADO方式把數據存儲到關系庫主要是acess、sqlsever。

  5. 腳本系統:紫金橋RealHistorian.完整的腳本語言,提供大量預定義函數,提供各種控制語句,可實現十分復雜的功能,同時有多種智能提示,使用方便簡潔。

    亞控組態王KingScada.完整的腳本語言,類VC,提供大量預定義函數,沒有中文注釋,需要對函數屬性比較熟悉才能熟練應用,使用較難

    力控ForceControl7.2 SP1.無

    傑控FaMe.直接內嵌的vb的腳本系統,腳本都是寫在統一界面,多處共用,但是開發需要有vb的基礎。

  6. 圖庫:紫金橋RealHistorian.為用戶提供幾千種具有立體效果的精美子圖,覆蓋各行各業,且可根據用戶需求,快速定製相關行業子圖。

    亞控組態王KingScada.KingScada提供較多的立體圖形,覆蓋各行各業,用戶也可根據需求定製子圖,比較精美

    力控ForceControl7.2 SP1.不精美,數量很多

    傑控FaMe.無

  7. HTML5:紫金橋RealHistorian.支持

    亞控組態王KingScada.

    力控ForceControl7.2 SP1.不支持

    傑控FaMe.不支持

  8. OPC Server組件:紫金橋RealHistorian.DA/UA

    亞控組態王KingScada.DA

    力控ForceControl7.2 SP1.支持DA(需要配置)

    傑控FaMe.不支持

  9. 跨平台支持能力:紫金橋RealHistorian.支持常用的Windows系列操作系統、支持國產麒麟系列操作系統以及RedHat、Ubuntu、CentOS等多種linux桌面操作系統和各種Linux嵌入式操作系統。除支持通用的Intel、AMD處理器,還支持龍芯、兆芯、飛騰、申威、眾志等國產處理器。

    亞控組態王KingScada. 支持的操作系統語言版本:中文簡體、英文。支持的操作系統位數:32位、64位Windows Server 2008 R2 標准版、Windows Server 2012 R2 企業版、Windows Server 2016 R2 企業版、Windows 7 旗艦版、Windows 8 專業版、Windows 10

    力控ForceControl7.2 SP1.只支持Windows系列操作系統

    傑控FaMe.只支持Windows系列操作系統

  10. 嵌入式系統支持能力:紫金橋RealHistorian.系統採用可裁剪式架構,以及擁有良好的跨平台特性,能夠適應多種不同配置的嵌入式設備及操作系統(嵌入式Linux、VxWorks、WinCE等)

    亞控組態王KingScada. 不支持

    力控ForceControl7.2 SP1.不支持

    傑控FaMe.不支持

  11. 單機容量:紫金橋RealHistorian.800萬點

    亞控組態王KingScada.100W點

    力控ForceControl7.2 SP1.最大案例大慶石油天然氣項目點數達40000點

    傑控FaMe.不知道

  12. 數據轉儲:紫金橋RealHistorian.支持通過數據轉儲功能配置,將實時數據和歷史數據存儲到各種關系庫當中SQL Server、Access97-2000、Access2002-2003、Access2007、Oracle、Mysql。

    亞控組態王KingScada.KingDataLogger主要實現從KingIOServer工程中讀取數據、緩存數據,並存儲至不同種類的資料庫、不同的表。目前支持的資料庫包括:工業庫KingHistorian、SQL Server、Access97-2000、Access2002-2003、Access2007、Oracle、Mysql

    力控ForceControl7.2 SP1. 不支持

    傑控FaMe. 不支持

希望對你有所幫助,通過數據分析得到你想要的

❹ 求ModBus TCP在PIC上的C語言實現

test1.cpp
-
Win32
console
app
to
read
registers
//
test1.cpp
5/23/97
//
example
Win32
C++
program
to
read
registers
from

PLC
via
gateway
//
compile
with
BC45
or
BC50
//
default
settings
for
Win32
console
app
//
empty
DEF
file
#include
<winsock.h>
#include
<stdio.h>
#include
<conio.h>
int
main(int
argc,
char
**argv)
{
if
(argc<5)
{
printf("usage:
test1
ip_adrs
unit
reg_no
num_regs\n"
"eg
test1
198.202.138.72
5
0
10\n");
return
1;
}
char
*ip_adrs
=
argv[1];
unsigned
short
unit
=
atoi(argv[2]);
unsigned
short
reg_no
=
atoi(argv[3]);
unsigned
short
num_regs
=
atoi(argv[4]);
printf("ip_adrs
=
%s
unit
=
%d
reg_no
=
%d
num_regs
=
%d\n",
ip_adrs,
unit,
reg_no,
num_regs);
//
initialize
WinSock
static
WSADATA
wd;
if
(WSAStartup(0x0101,
&wd))
{
printf("cannot
initialize
WinSock\n");

return
1;
}
//
set
up
socket
SOCKET
s;
s
=
socket(PF_INET,
SOCK_STREAM,
IPPROTO_TCP);
struct
sockaddr_in
server;
server.sin_family
=
AF_INET;
server.sin_port
=
htons(502);
//
ASA
standard
port
server.sin_addr.s_addr
=
inet_addr(ip_adrs);
int
i;
i
=
connect(s,
(sockaddr
*)&server,
sizeof(sockaddr_in));
if
(i<0)
{
printf("connect
-
error
%d\n",WSAGetLastError());
closesocket(s);
WSACleanup();
return
1;
}
fd_set
fds;
FD_ZERO(&fds);
timeval
tv;
tv.tv_sec
=
5;
tv.tv_usec
=
0;
//
wait
for
permission
to
send
FD_SET(s,
&fds);
i
=
select(32,
NULL,
&fds,
NULL,
&tv);
//
write
if
(i<=0)
{
printf("select
-
error
%d\n",WSAGetLastError());
closesocket(s);
WSACleanup();
return
1;
}
//
build
request
of
form
0
0
0
0
0
6
ui
3
rr
rr
nn
nn
unsigned
char
obuf[261];
unsigned
char
ibuf[261];

for
(i=0;i<5;i++)
obuf[i]
=
0;
obuf[5]
=
6;
obuf[6]
=
unit;
obuf[7]
=
3;
obuf[8]
=
reg_no
>>
8;
obuf[9]
=
reg_no
&
0xff;
obuf[10]
=
num_regs
>>
8;
obuf[11]
=
num_regs
&
0xff;
//
send
request
i
=
send(s,
obuf,
12,
0);
if
(i<12)
{
printf("failed
to
send
all
12
chars\n");
}
//
wait
for
response
FD_SET(s,
&fds);
i
=
select(32,
&fds,
NULL,
NULL,
&tv);
//read
if
(i<=0)
{
printf("no
TCP
response
received\n");
closesocket(s);
WSACleanup();
return
1;
}
//
read
response
i
=
recv(s,
ibuf,
261,
0);
if
(i<9)
{
if
(i==0)
{
printf("unexpected
close
of
connection
at
remote
end\n");
}
else
{
printf("response
was
too
short
-
%d
chars\n",
i);
}

}
else
if
(ibuf[7]
&
0x80)
{

printf("
Modbus
exception
response
-
type
%d\n",
ibuf[8]);
}
else
if
(i
!=
(9+2*num_regs))
{
printf("incorrect
response
size
is
%d
expected
%d\n",i,(9+2*num_regs));
}
else
{
for
(i=0;i<num_regs;i++)
{
unsigned
short
w
=
(ibuf[9+i+i]<<8)
+
ibuf[10+i+i];
printf("word
%d
=
%d\n",
i,
w);
}
}
//
close
down
closesocket(s);
WSACleanup();
return
0;
}

❺ modbus RTU 模式 C51實現

給你一段程序,我驗證過的*ptr為數組地址,len為數組長度
//*********************************
//crc8校驗程序
//*********************************
uchar crc8(uchar *ptr, uchar len)
{
uchar i;
uchar crc=0;
while(len--!=0)
{
for(i=1; i!=0; i*=2)
{
if((crc&1)!=0) {crc/=2; crc^=0x8C;}
else crc/=2;
if((*ptr&i)!=0) crc^=0x8C;
}
ptr++;
}
return(crc);
}

❻ 如圖,十進制轉十六進制(不要用print函數,不需要命令行輸出窗口)

你可能對十六進制的理解還不夠
C語言的源碼裡面的0x02是一個十六進制的整數,它代表的與十進制寫法的2沒有任何區別,
也就是說0x這個字元並不是必須寫的。
你直接把等號後面的值全部換成十進制就行了。

❼ 哪裡可以找到C語言一些經典的源碼

如果你沒接觸過系統內核開發,強烈建議您不要立馬去看Unix或Linux源碼,直接看源代碼基本沒有用處——無非是一大堆的C和少量的匯編!

如果您已經對C語言有所掌握,您會發現C語言本身的語法很簡單,確實很簡單!因此想進一步提高應當把精力放在練習「演算法」上,先學習如果處理常見數據結構和常見演算法,再試著編寫一些實用的程序。

注意:我指的是「ANSI標准C」,而不是VC、MFC C++。

❽ 無線數據終端是什麼

無線數據終端也叫無線數傳終端,即實現無線數據傳輸所使用的終端模塊。

無線數據終端通常與下位機相連,實現無線數據傳輸的目的,有「工業領域的手機」的稱號,因為其傳輸原理和我們平常使用的手機的數據傳輸時基本一致的。

其中比較典型的設備包括無線數傳,無線路由器,無線Modem等設備,下面介紹的就是應用最廣泛的DTU的相關參數作為參考。

為用戶提供高速,穩定可靠,數據終端永遠在線,多種協議轉換的虛擬專用網路。針對網路流量控制的用戶,產品支持語音,簡訊,數據觸發上線以及超時自動斷線的功能。同時也支持雙數據中心備份,以及多數據中心同步接收數據等功能。

(8)cmodbus源碼擴展閱讀:

無線數據終端的特點:

1、DNS自動獲取:自動獲取DNS,不再需要人工配置輸入DNS,規避了因為選擇的DNS伺服器異常,導致DTU設備當機的嚴重現象!

2、完善的協議棧: 新系統載入了完善的TCP/IP協議棧,原來系統採用的是輕量級TCP/IP(LPIP)協議棧,協議棧是有裁剪的,新系統採用了完善的TCP/IP協議棧,網路通信性能優異。

3、支持多中心:客戶數據可以同時往客戶指定的監控中心發送,最大支持發送中心達256個。

參考資料來源:網路-無線數傳終端

❾ 如何將freemodbus協議棧移植到linux下

(二)在HHARM2410-R3上的移植
完成了在普通red hat上的安裝,熟悉了藍牙協議棧一些基本的東西,下面的任務就是把協議棧搬到開發板上了。
第一步當然是內核了,由於華恆的內核代碼改過,我也不知道從bluez上下載的patch能不能使用,試試看了,只好。
# cd /HHARM2410/kernel
# gzip -dc ~/patch-2.4.18-mh15.gz | patch -p1
# find ./ -name '*rej'
./fs/cramfs/inode.c.rej
不好,有文件不能patch,看看是針對cramfs文件系統的patch,我也不清楚為什麼bluez的patch會修改到cramfs,不過我想 問題應該不大。內核源代碼關於bluetooth的部分華恆應該沒有改過,因此patch的主要部分應該是沒有問題的。如果內核編譯後發生問題,我想大概 也只有把內核代碼翻出來看了。
先就這樣了,用用試試看好了。與普通pc上的類似,只不過有些是m的現在統統為y了。我的配置關於Bluez的部分設置為:
#
# Bluetooth support
#
CONFIG_BLUEZ=y
CONFIG_BLUEZ_L2CAP=y
# CONFIG_BLUEZ_SCO is not set
CONFIG_BLUEZ_RFCOMM=y
CONFIG_BLUEZ_RFCOMM_TTY=y
CONFIG_BLUEZ_BNEP=y
CONFIG_BLUEZ_BNEP_MC_FILTER=y
CONFIG_BLUEZ_BNEP_PROTO_FILTER=y
# CONFIG_BLUEZ_HIDP is not set
#
# Bluetooth device drivers
#
CONFIG_BLUEZ_HCIUSB=y
# CONFIG_BLUEZ_HCIUSB_SCO is not set
# CONFIG_BLUEZ_HCIUART is not set
# CONFIG_BLUEZ_HCIBFUSB is not set
# CONFIG_BLUEZ_HCIDTL1 is not set
# CONFIG_BLUEZ_HCIBT3C is not set
# CONFIG_BLUEZ_HCIBLUECARD is not set
# CONFIG_BLUEZ_HCIBTUART is not set
# CONFIG_BLUEZ_HCIVHCI is not set

device部分就設了個USB的,其他的就不設置了。
下面繼續make dep;make zImage的常規過程,OK,沒有發生編譯問題,可以稍微舒口氣了。
下面要移植Bluez的基礎庫了,在Redhat 9下執行
# ldd /usr/lib/libbluetooth.so.1.0.17
libc.so.6 => /lib/libc.so.6 (0x4002c000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x80000000)
發現沒有依賴什麼莫名其妙的庫,應該換個編譯器就可以了,configure一下就可以了。我的配置命令很簡單:
# ./configure --host=armv4l --prefix=/HHARM2410/applications/bluezport/libs CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib
LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld
# make
# make install
OK了,到了/HHARM2410/applications/bluezport/libs下看看,我也不清楚為什麼,居然只有.a和.la的靜態庫,沒有動態庫。只好自己動手,到bluz-libs-2.17/src/下,自己編譯動態庫:
# /opt/host/armv4l/bin/armv4l-unknown-linux-gcc -shared -o libbluetooth.so.1.0.17 bluetooth.o hci.o sdp.o
再做兩個符號連接
# ln -s libbluetooth.so.1.0.17 libbluetooth.so
# ln -s libbluetooth.so.1.0.17 libbluetooth.so.1
好了,庫交叉編譯完畢,mv到/HHARM2410/application/bluezport/libs/lib文件夾下就可以了。

接著移植Bluez的工具集。與庫類似,先看一下各個程序需要用到什麼庫,比如:
#ldd /usr/sbin/hcid
libbluetooth.so.1 => /usr/lib/libbluetooth.so.1 (0x40035000)
libc.so.6 => /lib/libc.so.6 (0x40042000)
/lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)
挨個試試需要用的工具,發現需要的庫華恆和Bluez都提供了,應該換個編譯器編譯一下就可以了。編譯之前我為了到板子上與我自己的手機連接方便修改 了bluez-utils-2.17/hcid/security.c文件,在init_security_data函數中的設置默認的密碼,非常簡單地 改了兩行:
strcpy(hcid.pin_code, "123");
hcid.pin_len = 3;
然後configure我想就行了,我的configure設置為:
# ./configure --prefix=/HHARM2410-R3/applications/bluezport/utils --includedir=/HHARM2410-R3/applications/bluezport/libs/include --libdir=/HHARM2410-R3/applications/bluezport/libs/lib --with-bluez=/HHARM2410-R3/applications/bluezport/libs --disable-test --disable-cups --disable-pcmia --host=armv4l CC=/opt/host/armv4l/bin/armv4l-unknown-linux-gcc CPP=/opt/host/armv4l/bin/armv4l-unknown-linux-cpp AR=/opt/host/armv4l/bin/armv4l-unknown-linux-ar STRIP=/opt/host/armv4l/bin/armv4l-unknown-linux-strip RANLIB=/opt/host/armv4l/bin/armv4l-unknown-linux-ranlib LD=/opt/host/armv4l/bin/armv4l-unknown-linux-ld
# make
我在這步make的時候出現了一點小錯誤,好像是說PATH_MAX沒有定義,這個是LINUX設置的存放路徑名緩沖區的最大長度。應該是少包含了一個頭文件造成的。我沒有去仔細考究,就在當前文件下的config.h中添加了三行:
#ifndef PATH_MAX
#define PATH_MAX 4095/* PAGE_SIZE - 1 */
#endif
採用簡單粗魯的添加定義的方式。再make,通過。
# make install
好了,工具集都在/HHARM2410-R3/applications/bluezport/util下了
最後,由於在PC的LINUX下的默認pin_helper /usr/bin/bluepin是用python寫的代碼,在2410上當然不能用了,所以要自己寫一個pin_helper的程序。翻翻 /usr/bin/bluepin的代碼以及hcid/security.c的代碼,事實上hcid進程在驗證PIN code的時候開了一個pipe指向pin_helper進程的標准輸出,pin_helper進程向用戶詢問PIN code,如果用戶輸入密碼XXXX就以"PIN:XXXX"的形式寫到標准輸出中去,如果用戶reject就寫個"ERR"回去。
我以一種最簡單的方式實現pin_helper程序,即固定地寫一個code回去,比如123,犧牲安全性。
用腳本實現就是:
#!/bin/sh

echo "PIN:123"
用C實現一個就是:
#include <stdio.h>

int main(int argc, char* argv[])
{
printf("PIN:123");
}
交叉編譯成my_pin_helper再放到板子的/usr/bin下,那麼就可以把板子的hcid.conf修改成:
pin_helper /usr/pin/my_pin_helper
後來,我在板子上也用MiniGUI寫了一個pin_helper,也挺簡單的。

好了,一切准備完畢,做好ramdisk,記得在/dev下mknod幾個rfcomm,放到板子上,可以運行!
插上USB適配器,連模塊都不用probe
# hciconfig hci0 up
# hcid -f /etc/bluetooth/hcid.conf
# hciconfig -a

熱點內容
編程作業方法 發布:2024-11-21 01:32:54 瀏覽:228
usb傳屏器如何配置 發布:2024-11-21 01:13:53 瀏覽:13
解釋方式和編譯方式有什麼區別 發布:2024-11-21 01:09:21 瀏覽:127
安卓下游戲用什麼軟體 發布:2024-11-21 01:07:45 瀏覽:793
伺服器當電腦使用需要什麼 發布:2024-11-21 00:52:50 瀏覽:790
怎麼改百度游戲密碼 發布:2024-11-21 00:48:35 瀏覽:158
冬天存儲蔬菜 發布:2024-11-21 00:47:37 瀏覽:450
為什麼安卓安裝包損壞 發布:2024-11-21 00:41:09 瀏覽:607
手機當前密碼在哪裡 發布:2024-11-21 00:35:23 瀏覽:67
linux下如何修改密碼 發布:2024-11-21 00:20:11 瀏覽:65