首页 上一页 1 2 3 下一页 尾页

求助:谁能给我一份用C编写的Modbus程序 点击:4949 | 回复:41



宋潇潇

    
  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2006年4月18日
发表于:2006-04-19 20:52:00
楼主
谢谢!
小弟刚刚接触到实际通信协议的编写,对如何编写Modbus通信协议感觉到无从下手,很想找一份用C编写的Modbus通信协议看看。希望各位大牛帮帮小弟,小弟在这里先谢过了!
sxx_pippen@etang.com



叶帆

  • 精华:1帖
  • 求助:0帖
  • 帖子:18帖 | 88回
  • 年度积分:0
  • 历史总积分:239
  • 注册:2003年9月03日
发表于:2006-04-21 19:30:00
1楼
力控的开发包里就有免费的Modbus协议(C语言的)
你可以参考:
long MakeWriteASCII16(CItem* pItem, LPCSTR szWriteData, char* chCommand, int& nCmdLen)
{
CPacket* pPacket = pItem->GetPacket();
(pPacket->GetPrivateData()).n[2] = HLS_W_WRITE;
CString csPmessage;
IOITEMDEF * pItemStru = pItem->GetItemStru();
chCommand[0] = 0x3A; //写入帧头
CDevice* pDevice = pPacket->GetDevice();
CString csAddr = pDevice->GetAddr();
char byBuf[256];
int nTemp;
long lData;
sscanf((const char *)csAddr,"%d",&nTemp);
sprintf(byBuf,"%02x",nTemp); //把十进制地址转化为十六进制字符串
chCommand[1] = byBuf[0]; //写入从机地址
chCommand[2] = byBuf[1];
switch(pItemStru->n[0]) //写入功能号
{
case 1: chCommand[3] = 0x30;//写输出线圈
chCommand[4] = 0x35;
csPmessage+="写输出线圈";
break;
case 2: chCommand[3] = 0x30;//写保持寄存器
chCommand[4] = 0x36;
csPmessage+="写保持寄存器";
break;
//hll modify
case 4: chCommand[3] = 0x30;//查询命令
chCommand[4] = 0x38;
csPmessage+="写保持寄存器";
break;
default :
break;
}
csPmessage+=":地址";
sprintf(byBuf,"%04x",pItemStru->n[1]);
chCommand[5] = byBuf[0]; //写入开始地址
chCommand[6] = byBuf[1];
chCommand[7] = byBuf[2];
chCommand[8] = byBuf[3];
csPmessage+=byBuf;
sscanf(szWriteData,"%ld",&lData);
switch(pItemStru->n[0])
{
case 1: if(lData!=0)
{
chCommand[9]  = 0x46;
chCommand[10] = 0x46;
chCommand[11] = 0x30;
chCommand[12] = 0x30;
csPmessage += " ON";
}
else
{
chCommand[9]  = 0x30;
chCommand[10] = 0x30;
chCommand[11] = 0x30;
chCommand[12] = 0x30;
csPmessage += " OFF";
}
break;
case 2: sprintf(byBuf,"%04x",WORD(lData));
chCommand[9]  = byBuf[0];
chCommand[10] = byBuf[1];
chCommand[11] = byBuf[2];
chCommand[12] = byBuf[3];
csPmessage += byBuf;
csPmessage += "H";
break;
default:
break;
}
if((pDevice->GetCfgStru())->n[DEV_Model] == 0 
&& pDevice->GetCfgStru()->n[DEV_Protocol] == 0)
{
BYTE bCheck = (BYTE)GetCheckCode(HLS_ASCII,chCommand,12);
sprintf(byBuf,"%02x",bCheck);
chCommand[13] = byBuf[0]; //写入校验码
chCommand[14] = byBuf[1];
chCommand[15] = 0x0D; //写入帧尾
chCommand[16] = 0x0A;
nCmdLen = 17;
chCommand[17] = '\0';
strupr(chCommand); //小写字母变为大写
}
else
{//只是为了转化成其他格式的命令,在这里不用生成校验
chCommand[13] = '\0';
strupr(chCommand);
nCmdLen = 13;
}
pDevice->ShowProcessMessage(csPmessage);
return SEND | WAIT;
}

//写16号命令
long MakeWriteASCII32To16(CItem* pItem, LPCSTR szWriteData, char* chCommand, int& nCmdLen)
{
CPacket* pPacket = pItem->GetPacket();
(pPacket->GetPrivateData()).n[2] = HLS_W_WRITE;
CString csPmessage;
IOITEMDEF * pItemStru = pItem->GetItemStru();
chCommand[0] = 0x3A; //写入帧头
CDevice* pDevice = pPacket->GetDevice();
CString csAddr = pDevice->GetAddr();
char byBuf[256];
int nTemp;
sscanf((const char *)csAddr,"%d",&nTemp);
sprintf(byBuf,"%02x",nTemp); //把十进制地址转化为十六进制字符串
chCommand[1] = byBuf[0]; //写入从机地址
chCommand[2] = byBuf[1];
chCommand[3] = 0x31;//写功能号
chCommand[4] = 0x30;
csPmessage+="写保持寄存器";
csPmessage+=":地址";
sprintf(byBuf,"%04x",pItemStru->n[1]);
chCommand[5] = byBuf[0]; //写入开始地址
chCommand[6] = byBuf[1];
chCommand[7] = byBuf[2];
chCommand[8] = byBuf[3];
csPmessage+=byBuf;
csPmessage+="H";
chCommand[9] = 0x30;
chCommand[10]= 0x30;
chCommand[11]= 0x30;
chCommand[12]= 0x31;
chCommand[13]= 0x30;
chCommand[14]= 0x32;
int nData;
sscanf(szWriteData,"%d",&nData);
sprintf(byBuf,"%04x",nData);
chCommand[15] = byBuf[0];
chCommand[16] = byBuf[1];
chCommand[17] = byBuf[2];
chCommand[18] = byBuf[3];
if(pDevice->GetCfgStru()->n[DEV_Model] == 0 
&& pDevice->GetCfgStru()->n[DEV_Protocol] == 0)
{
BYTE bCheck = (BYTE)GetCheckCode(HLS_ASCII,chCommand,18);
sprintf(byBuf,"%02x",bCheck);
chCommand[19] = byBuf[0]; //写入校验码
chCommand[20] = byBuf[1];
chCommand[21] = 0x0D; //写入帧尾
chCommand[22] = 0x0A;
nCmdLen = 23;
chCommand[23] = '\0';
strupr(chCommand); //小写字母变为大写
}
else
{//只是为了转化成其他格式的命令,在这里不用生成校验
chCommand[19] = '\0';
strupr(chCommand);
nCmdLen = 19;
}
pDevice->ShowProcessMessage(csPmessage);
return SEND | WAIT;
}
。。。。
叶帆工作室:http://blog.csdn.net/yefanqiu

宋潇潇

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:7
  • 注册:2006年4月18日
发表于:2006-04-24 18:38:00
2楼
谢谢!太感谢了!

余键

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 6回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2006-04-24 20:38:00
3楼
请问yefan力控的开发包是怎么回事啊?在哪里能找到呢?

叶帆

  • 精华:1帖
  • 求助:0帖
  • 帖子:18帖 | 88回
  • 年度积分:0
  • 历史总积分:239
  • 注册:2003年9月03日
发表于:2006-04-24 23:27:00
4楼
力控组态演示盘里就有

余键

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 6回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2006-04-25 10:22:00
5楼
还是拜托能发一份给我吗?jyu1226@gmail.com
急用,bow

余键

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 6回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2006-04-25 10:24:00
6楼
我找了个北京三维力控科技有限公司的网页http://www.sunwayland.com.cn/
但是在上面好像没有你说的东西哦

余键

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 6回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2006-04-25 11:53:00
7楼
yefan。或者就在这个帖子里面贴出来也行,谢谢,顺便也可以让大家看一下

mutongxin

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 2回
  • 年度积分:0
  • 历史总积分:8
  • 注册:2006年4月15日
发表于:2006-04-25 14:14:00
8楼
老师能不能给我也发一份,我在做关于modbus tcp/ip的毕业设计
mutongxin2006@163.com qq:630943715

余键

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 6回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2006-04-25 14:34:00
9楼
呵呵,都希望yefan大哥出手相助

叶帆

  • 精华:1帖
  • 求助:0帖
  • 帖子:18帖 | 88回
  • 年度积分:0
  • 历史总积分:239
  • 注册:2003年9月03日
发表于:2006-04-29 17:36:00
10楼
程序已发

你是我的朋友

  • 精华:0帖
  • 求助:0帖
  • 帖子:3帖 | 33回
  • 年度积分:0
  • 历史总积分:56
  • 注册:2004年7月19日
发表于:2006-04-30 16:25:00
11楼
 叶老师,麻烦也给我一份,谢谢!
 wdh2226@163.com

余键

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 6回
  • 年度积分:0
  • 历史总积分:59
  • 注册:2006年4月24日
发表于:2006-04-30 18:29:00
12楼
谢谢,真是太感谢了。

bingfeng

  • 精华:0帖
  • 求助:0帖
  • 帖子:6帖 | 14回
  • 年度积分:0
  • 历史总积分:124
  • 注册:2005年9月12日
发表于:2006-05-05 21:09:00
13楼
能否把c的modbus源码也给我一份,谢谢

欧弟

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 5回
  • 年度积分:0
  • 历史总积分:5
  • 注册:2006年6月13日
发表于:2006-06-13 19:45:00
14楼
感谢yefan大哥提供
不过这好象是用ASCII型式所编的
如果要用RTU型式 请问该如何改呢?

xiaoxiaoli

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2006年7月28日
发表于:2006-07-28 10:42:00
15楼
叶帆大哥,我现在也在做modbus的项目,能否给我发一份呀!
lixiaojun203203@sina.com

lihongyan

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 172回
  • 年度积分:0
  • 历史总积分:267
  • 注册:2006年7月31日
发表于:2006-08-25 09:41:00
16楼
能拜托给我也发一份吗谢谢了
  我的邮箱是lhy12201123@126.com

ciscosamre

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 1回
  • 年度积分:0
  • 历史总积分:1
  • 注册:2006年9月13日
发表于:2006-09-13 17:20:00
17楼
能否给我也发一份,不胜感激
cisco_samre@163.com

西域风采

  • 精华:0帖
  • 求助:0帖
  • 帖子:1帖 | 3回
  • 年度积分:0
  • 历史总积分:6
  • 注册:2006年5月09日
发表于:2006-09-26 17:59:00
18楼
能否给我一份,谢谢了!

lslwyc@126.com

姜斌

  • 精华:0帖
  • 求助:0帖
  • 帖子:0帖 | 3回
  • 年度积分:0
  • 历史总积分:55
  • 注册:2006年5月22日
发表于:2006-10-16 10:27:00
19楼
叶老师能不能给我一份!
要是大家收到的话能不能给小弟传一份!
jiangbin1979@126.com
谢谢了 

www.cn

  • 精华:0帖
  • 求助:0帖
  • 帖子:48帖 | 1717回
  • 年度积分:0
  • 历史总积分:2433
  • 注册:2006年5月16日
发表于:2006-10-28 21:14:00
20楼
能发给我一份吗,谢谢
blueblue1234567@163.com

热门招聘
相关主题

官方公众号

智造工程师
    首页 上一页 1 2 3 下一页 尾页