当前位置:首页 » 操作系统 » 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