OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 8108|回复: 26

战舰F103的MODBUS从机,请帮忙测试下!

[复制链接]

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
发表于 2017-4-1 12:05:31 | 显示全部楼层 |阅读模式
1金钱
这个是根据论坛上别人上传的的自己修改了下,我用的是战舰F103的板子,求人帮忙测试下,在淘宝买的USB转485模块还没有来,求帮忙!

最佳答案

查看完整内容[请看2#楼]

完成了,支持01、 02 、03 、05、 06、 15、 16 等功能码,希望大家喜欢。 主机的还没写,正准备改写。 这是我在原作者的基础上修改的,谢谢原作者。 调试2天终于完全搞定从机。 上传上来,希望大家喜欢。 我用的是战舰STM32F103ZE的板子,比较悲剧的是我的3485芯片坏了,我后面自己外界一个ADM2438,有兴趣的朋友可以拿去耍了
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-1 12:05:32 | 显示全部楼层
ModBus----slave.rar (2.31 MB, 下载次数: 1458)
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-1 12:06:29 | 显示全部楼层
本帖最后由 刘东君 于 2017-4-2 14:39 编辑

啊哈哈哈
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-1 15:02:23 | 显示全部楼层
本帖最后由 刘东君 于 2017-4-1 15:05 编辑

自己写的校验码有问题,求问这个校验码,咋样写?有没有资料!
这是回复的报文 01 83 04 确定校验码问题。 我去查找资料了!!!
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3765
金钱
3765
注册时间
2015-4-26
在线时间
762 小时
发表于 2017-4-1 15:04:57 | 显示全部楼层
用串口测啊,可以不用485的。百度下一大堆modbus crc 复制过来就行
我有故事,你有酒吗
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-1 15:13:11 | 显示全部楼层
来俩不甜的 发表于 2017-4-1 15:04
用串口测啊,可以不用485的。百度下一大堆modbus crc 复制过来就行

const u8 auchCRCHi[] = {
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40, 0x00, 0xC1, 0x81, 0x40,
0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0, 0x80, 0x41, 0x00, 0xC1,0x81, 0x40, 0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41,
0x00, 0xC1, 0x81, 0x40, 0x01, 0xC0, 0x80, 0x41, 0x01, 0xC0,0x80, 0x41, 0x00, 0xC1, 0x81, 0x40} ;


const u8 auchCRCLo[] = {
0x00, 0xC0, 0xC1, 0x01, 0xC3, 0x03, 0x02, 0xC2, 0xC6, 0x06,0x07, 0xC7, 0x05, 0xC5, 0xC4, 0x04, 0xCC, 0x0C, 0x0D, 0xCD,
0x0F, 0xCF, 0xCE, 0x0E, 0x0A, 0xCA, 0xCB, 0x0B, 0xC9, 0x09,0x08, 0xC8, 0xD8, 0x18, 0x19, 0xD9, 0x1B, 0xDB, 0xDA, 0x1A,
0x1E, 0xDE, 0xDF, 0x1F, 0xDD, 0x1D, 0x1C, 0xDC, 0x14, 0xD4,0xD5, 0x15, 0xD7, 0x17, 0x16, 0xD6, 0xD2, 0x12, 0x13, 0xD3,
0x11, 0xD1, 0xD0, 0x10, 0xF0, 0x30, 0x31, 0xF1, 0x33, 0xF3,0xF2, 0x32, 0x36, 0xF6, 0xF7, 0x37, 0xF5, 0x35, 0x34, 0xF4,
0x3C, 0xFC, 0xFD, 0x3D, 0xFF, 0x3F, 0x3E, 0xFE, 0xFA, 0x3A,0x3B, 0xFB, 0x39, 0xF9, 0xF8, 0x38, 0x28, 0xE8, 0xE9, 0x29,
0xEB, 0x2B, 0x2A, 0xEA, 0xEE, 0x2E, 0x2F, 0xEF, 0x2D, 0xED,0xEC, 0x2C, 0xE4, 0x24, 0x25, 0xE5, 0x27, 0xE7, 0xE6, 0x26,
0x22, 0xE2, 0xE3, 0x23, 0xE1, 0x21, 0x20, 0xE0, 0xA0, 0x60,0x61, 0xA1, 0x63, 0xA3, 0xA2, 0x62, 0x66, 0xA6, 0xA7, 0x67,
0xA5, 0x65, 0x64, 0xA4, 0x6C, 0xAC, 0xAD, 0x6D, 0xAF, 0x6F,0x6E, 0xAE, 0xAA, 0x6A, 0x6B, 0xAB, 0x69, 0xA9, 0xA8, 0x68,
0x78, 0xB8, 0xB9, 0x79, 0xBB, 0x7B, 0x7A, 0xBA, 0xBE, 0x7E,0x7F, 0xBF, 0x7D, 0xBD, 0xBC, 0x7C, 0xB4, 0x74, 0x75, 0xB5,
0x77, 0xB7, 0xB6, 0x76, 0x72, 0xB2, 0xB3, 0x73, 0xB1, 0x71,0x70, 0xB0, 0x50, 0x90, 0x91, 0x51, 0x93, 0x53, 0x52, 0x92,
0x96, 0x56, 0x57, 0x97, 0x55, 0x95, 0x94, 0x54, 0x9C, 0x5C,0x5D, 0x9D, 0x5F, 0x9F, 0x9E, 0x5E, 0x5A, 0x9A, 0x9B, 0x5B,
0x99, 0x59, 0x58, 0x98, 0x88, 0x48, 0x49, 0x89, 0x4B, 0x8B,0x8A, 0x4A, 0x4E, 0x8E, 0x8F, 0x4F, 0x8D, 0x4D, 0x4C, 0x8C,
0x44, 0x84, 0x85, 0x45, 0x87, 0x47, 0x46, 0x86, 0x82, 0x42,0x43, 0x83, 0x41, 0x81, 0x80, 0x40} ;


u16 CRC_Compute(u8 *puchMsg, u16 usDataLen)
{
        u8 uchCRCHi = 0xFF ;
        u8 uchCRCLo = 0xFF ;
        u32 uIndex ;
        while (usDataLen--)
        {
                uIndex = uchCRCHi ^ *puchMsg++ ;
                uchCRCHi = uchCRCLo ^ auchCRCHi[uIndex] ;
                uchCRCLo = auchCRCLo[uIndex] ;
        }
        return (uchCRCHi << 8 | uchCRCLo) ;
}//uint16 crc16(uint8 *puchMsg, uint16 usDataLen)

u16 startRegAddr;
u16 RegNum;
u16 calCRC;
void RS485_Service(void)
{
        u16 recCRC;
        if(RS485_FrameFlag==1)
        {
                if(RS485_RX_BUFF[0]==RS485_Addr)//地址正确
                {
                        if((RS485_RX_BUFF[1]==01)||(RS485_RX_BUFF[1]==02)||(RS485_RX_BUFF[1]==03)||(RS485_RX_BUFF[1]==05)||(RS485_RX_BUFF[1]==06)||(RS485_RX_BUFF[1]==15)||(RS485_RX_BUFF[1]==16))//功能码正确
                  {
                                startRegAddr=(((u16)RS485_RX_BUFF[2])<<8)|RS485_RX_BUFF[3];//获取寄存器起始地址
                                if(startRegAddr<1000)//寄存器地址在范围内
                                {
                                        calCRC=CRC_Compute(RS485_RX_BUFF,RS485_RX_CNT-2);//计算所接收数据的CRC
                                        recCRC=RS485_RX_BUFF[RS485_RX_CNT-2]|(((u16)RS485_RX_BUFF[RS485_RX_CNT-1])<<8);//接收到的CRC(低字节在前,高字节在后)

回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-1 15:13:53 | 显示全部楼层
来俩不甜的 发表于 2017-4-1 15:04
用串口测啊,可以不用485的。百度下一大堆modbus crc 复制过来就行

http://www.360doc.com/content/13/0306/17/8474252_269692061.shtml
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-1 15:22:22 | 显示全部楼层
来俩不甜的 发表于 2017-4-1 15:04
用串口测啊,可以不用485的。百度下一大堆modbus crc 复制过来就行

无标题.png

谢谢,帮忙! 搞反了!!!!
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-1 16:38:30 | 显示全部楼层
来俩不甜的 发表于 2017-4-1 15:04
用串口测啊,可以不用485的。百度下一大堆modbus crc 复制过来就行

不过现在收不到返回的数据,不知道咋回事! 用示波器看 是有数据的!!
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-1 16:43:30 | 显示全部楼层
来俩不甜的 发表于 2017-4-1 15:04
用串口测啊,可以不用485的。百度下一大堆modbus crc 复制过来就行

如果我的 a【2】=2 ;a【3】=FA00
还有啊,比如说我读取  01 03 00 02 00 02 65 CB
那么我返回数据时候是先返回高字节,还是先返回低字节:

高字节例如:01 03 04 00 02 FA 00   。。。。

低字节例如:01 03 04 02 00 00 FA 。。。。。。。
哪个对啊? 是不是 先返回高字节的对?

现在调试精灵收不到信息和开始的3.5个字节有关系吗?
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-1 16:53:01 | 显示全部楼层
累了,明天再说,下班了!!




////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Modbus寄存器和单片机寄存器的映射关系
vu32 *Modbus_InputIO[100];//输入开关量寄存器指针(这里使用的是位带操作)
vu32 *Modbus_OutputIO[100];//输出开关量寄存器指针(这里使用的是位带操作)
u16 *Modbus_HoldReg[1000];//保持寄存器指针
u32 testData1=256,testData2=512;
void Modbus_RegMap(void)
{
        //输入开关量寄存器指针指向
        Modbus_InputIO[0]=(vu32*)&Ein(4);//KEY0
        Modbus_InputIO[1]=(vu32*)&Ein(3);//KEY1
        Modbus_InputIO[2]=(vu32*)&Ein(2);//KEY2
        Modbus_InputIO[3]=(vu32*)&Ain(0);//KEY3
        
        //输出开关量寄存器指针指向
        Modbus_OutputIO[0]=(vu32*)&Bout(5);//LED0
        Modbus_OutputIO[1]=(vu32*)&Eout(5);//LED1
        
        //保持寄存器指针指向
        Modbus_HoldReg[0]=(u16*)&testData1;//测试数据1
        Modbus_HoldReg[1]=0;//((u16*)&testData1)+1;//测试数据1
        Modbus_HoldReg[2]=0;//(u16*)&testData2;//测试数据2
        Modbus_HoldReg[3]=0;//((u16*)&testData2)+1;//测试数据2
        Modbus_HoldReg[4]=0;
        Modbus_HoldReg[5]=0;
        Modbus_HoldReg[6]=0;
}

求讲解这几个定义!!
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-1 17:00:59 | 显示全部楼层
yklstudent 发表于 2017-4-1 15:38
recCRC=RS485_RX_BUFF[RS485_RX_CNT-2]|(((u16)RS485_RX_BUFF[RS485_RX_CNT-1])

这里搞定了,现在是往回发,电脑收不到数据了。。。。。
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-1 17:01:17 | 显示全部楼层
刘东君 发表于 2017-4-1 16:53
累了,明天再说,下班了!!

这里,好像有点明白了。
回复

使用道具 举报

69

主题

978

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
3765
金钱
3765
注册时间
2015-4-26
在线时间
762 小时
发表于 2017-4-1 17:35:51 | 显示全部楼层
ni 串口有偶校验没,一般是8N1的。看你串口工具开着校验
我有故事,你有酒吗
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-2 08:15:34 | 显示全部楼层
来俩不甜的 发表于 2017-4-1 17:35
ni 串口有偶校验没,一般是8N1的。看你串口工具开着校验

我给改为 8 N1了,我在试试
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-2 09:16:06 | 显示全部楼层
本帖最后由 刘东君 于 2017-4-2 09:40 编辑
来俩不甜的 发表于 2017-4-1 17:35
ni 串口有偶校验没,一般是8N1的。看你串口工具开着校验

无标题.png   我按照这个发送的命令,然后检测示波器返回的命令应该是01 03 04 00 00 00 00 FA 33 下面是示波器的截图,应该没问题啊! 1.jpg 2.jpg 3.jpg    示波器表笔 一端GND 一端PA2,数据正常。





回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-2 09:39:43 | 显示全部楼层
本帖最后由 刘东君 于 2017-4-2 09:42 编辑
来俩不甜的 发表于 2017-4-1 17:35
ni 串口有偶校验没,一般是8N1的。看你串口工具开着校验

485-1.jpg 485-2.jpg   这是示波器表笔一端485-A,一端485-B的波形,貌似不正确了,我们的示波器只有一个探头好使了,呼叫原子哥,我这串口发出的数据没有问题,到485AB两端出现问题了!!这是咋回事啊!!!
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-2 09:42:55 | 显示全部楼层
刘东君 发表于 2017-4-2 09:39
这是示波器表笔一端485-A,一端485-B的波形,貌似不正确了,我们的示波器只有一个探头好使了,呼叫原子 ...

第3个数据不正确了,应该是04 而且后面的数据也不正确了!!!!!
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-2 12:09:33 | 显示全部楼层
刘东君 发表于 2017-4-2 09:39
这是示波器表笔一端485-A,一端485-B的波形,貌似不正确了,我们的示波器只有一个探头好使了,呼叫原子 ...

微信图片_20170402120839.jpg 微信图片_20170402120845.jpg   搞定了,芯片出问题了!!

回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-2 14:27:36 | 显示全部楼层
已完成
回复

使用道具 举报

0

主题

6

帖子

0

精华

新手入门

积分
19
金钱
19
注册时间
2017-3-26
在线时间
4 小时
发表于 2017-4-12 22:31:42 | 显示全部楼层
楼楼  我下载下来收不到数据呀,你怎么调试的,把调试好的传上来看看参考下可以不?谢谢
回复

使用道具 举报

24

主题

257

帖子

0

精华

高级会员

Rank: 4

积分
770
金钱
770
注册时间
2017-2-19
在线时间
133 小时
 楼主| 发表于 2017-4-13 09:13:44 | 显示全部楼层
Luck 发表于 2017-4-12 22:31
楼楼  我下载下来收不到数据呀,你怎么调试的,把调试好的传上来看看参考下可以不?谢谢

http://www.openedv.com/forum.php?mod=viewthread&tid=98367&extra=
去这里下载,都是我实验好的
回复

使用道具 举报

4

主题

93

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
262
金钱
262
注册时间
2016-10-27
在线时间
47 小时
发表于 2017-4-26 22:50:06 | 显示全部楼层
我下载了你这个页面上面从机的程序,用的也是MODBUS调试精灵,现在收不到数据,我发帖子了,你看看呢

http://www.openedv.com/forum.php ... id=98367&extra=
回复

使用道具 举报

13

主题

85

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1897
金钱
1897
注册时间
2016-8-20
在线时间
238 小时
发表于 2018-11-6 16:52:26 | 显示全部楼层
u16 *Modbus_HoldReg[1000];//保持寄存器指针
u32 testData1=1201,testData2=1002,testData3=2303,testData4=8204;



//保持寄存器指针指向
        Modbus_HoldReg[0]=(u16*)&testData1;//测试数据1  
        Modbus_HoldReg[1]=(u16*)&testData2;//((u16*)&testData1)+1;//测试数据1
        Modbus_HoldReg[2]=(u16*)&testData3;//(u16*)&testData2;//测试数据2
        Modbus_HoldReg[3]=(u16*)&testData4;//((u16*)&testData2)+1;//测试数据2
        Modbus_HoldReg[4]=(u16*)&testData1;
                Modbus_HoldReg[5]=(u16*)&testData2;
                Modbus_HoldReg[6]=(u16*)&testData3;


RS485_TX_BUFF[3+i*2]=(*Modbus_HoldReg[startRegAddr+i]>>8)&0xFF;//           /////////先发送高字节--在发送低字节
                        RS485_TX_BUFF[4+i*2]=(*Modbus_HoldReg[startRegAddr+i])&0xFF; //

朋友,最近我在搞从机的部分,刚好看到你的代码,上面的代码是我不能理解的地方,又是指针,又是数组的,就这底层没有看懂,不好理解,希望朋友能解答一下疑惑

回复

使用道具 举报

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2018-11-3
在线时间
58 小时
发表于 2019-3-14 21:56:15 | 显示全部楼层
请问,你modbus是怎么调式的?我进入debug模式调后,用modbus调试精灵发送命令,没有数据返回了,如果没有进入debug模式,程序是能返回正确结果的?
回复

使用道具 举报

4

主题

16

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
270
金钱
270
注册时间
2018-11-3
在线时间
58 小时
发表于 2019-3-14 21:56:37 | 显示全部楼层
请问,你modbus是怎么调式的?我进入debug模式调后,用modbus调试精灵发送命令,没有数据返回了,如果没有进入debug模式,程序是能返回正确结果的?
回复

使用道具 举报

1

主题

7

帖子

0

精华

新手上路

积分
26
金钱
26
注册时间
2019-7-10
在线时间
3 小时
发表于 2019-7-16 09:32:37 | 显示全部楼层
楼主,你测试成功了吗?可否将主机从机的源码都分享一下~
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-2-26 23:45

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表