搜索
bottom↓
楼主: xukai871105

STM32 移植FreeModbus 详细过程

  [复制链接]

出0入0汤圆

 楼主| 发表于 2013-7-22 20:27:27 | 显示全部楼层
zhepingli 发表于 2013-7-22 18:48
请问你是如何解决在任意地方调用数组的?我现在也遇到这样的问题!想读取单个Io和设置单个IO状态 ...

给点提示吧,使用extern
如果还不明白,我可以写的详细点。

出0入0汤圆

发表于 2013-7-22 21:27:13 | 显示全部楼层
xukai871105 发表于 2013-7-22 20:27
给点提示吧,使用extern
如果还不明白,我可以写的详细点。

我是用extern 声明数组的啊!我用GPIO.8控制LED灯!在IO口处理函数中我用LED0=ucRegCoilsBuf[1];在协议中输入10 05 00 01 FF 00 DD FA 后没有反应,是否那里有问题啊?

出0入0汤圆

发表于 2013-7-22 21:31:49 | 显示全部楼层
zhepingli 发表于 2013-7-22 21:27
我是用extern 声明数组的啊!我用GPIO.8控制LED灯!在IO口处理函数中我用LED0=ucRegCoilsBuf[1];在协议 ...

写错了指令是 01 05 00 01 FF 00 DD FA

出0入0汤圆

发表于 2013-7-22 22:04:35 | 显示全部楼层
xukai871105 发表于 2013-7-22 20:27
给点提示吧,使用extern
如果还不明白,我可以写的详细点。

那好啊!最好能有控制IO口的函数!我再看一下那些地方不太对!刚接触STM32!谢谢楼主

出0入0汤圆

发表于 2013-7-23 14:47:52 | 显示全部楼层
xukai871105 发表于 2012-8-17 11:08
我就是使用freemodbus和屏通(一家台湾的触摸屏公司)的触摸屏通信的!

其他的屏,例如西门子,欧姆龙的也 ...

楼主!你的MODBUS通讯能在其他地方读取当IO和设置吗?我现在的程序在其他地方能访问03功能!但就是不能访问到02 05 功能?能否给份参考程序呢?

出0入0汤圆

 楼主| 发表于 2013-7-23 23:06:04 | 显示全部楼层
zhepingli 发表于 2013-7-23 14:47
楼主!你的MODBUS通讯能在其他地方读取当IO和设置吗?我现在的程序在其他地方能访问03功能!但就是不能访 ...

我只能建议你耐心一点分析几个主要的交换函数。
例如
eMBErrorCode
eMBRegHoldingCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNRegs,
eMBRegisterMode eMode )

出0入0汤圆

发表于 2013-7-24 17:03:58 | 显示全部楼层
你好 试过同时用两个485的都是MODUS协议  两个485同时接收 会有一路接收不上来  因为 用定时后 两路485肯定有一路接收完了 另一路的时间判断超出了 一串数据   有这个问题 请教一下

出0入0汤圆

发表于 2013-7-24 19:21:26 | 显示全部楼层
xukai871105 发表于 2013-7-23 23:06
我只能建议你耐心一点分析几个主要的交换函数。
例如
eMBErrorCode

谢谢!还是好好分析哈!

出0入0汤圆

 楼主| 发表于 2013-7-25 09:00:21 | 显示全部楼层
zishiquan 发表于 2013-7-24 17:03
你好 试过同时用两个485的都是MODUS协议  两个485同时接收 会有一路接收不上来  因为 用定时后 两路485肯定 ...

"因为 用定时后 两路485肯定有一路接收完了 另一路的时间判断超出了 一串数据   有这个问题 请教一下"

能不能说的详细点,两个都是modbus从机吗。
再问,物理链路是RS485还是RS422

出0入0汤圆

 楼主| 发表于 2013-7-25 09:01:48 | 显示全部楼层
zhepingli 发表于 2013-7-24 19:21
谢谢!还是好好分析哈!

难道我要再一写一个freemodbus应用笔记而不是移植笔记

出0入0汤圆

发表于 2013-7-25 09:12:32 | 显示全部楼层
xukai871105 发表于 2013-7-25 09:01
难道我要再一写一个freemodbus应用笔记而不是移植笔记

我想如果能写出一个项目应用笔记应该会很实用的啦!楼主若有时间能搞出来当然会很好了!谢谢你的回答!

出0入0汤圆

发表于 2013-7-25 09:40:43 | 显示全部楼层

出0入0汤圆

 楼主| 发表于 2013-7-25 10:05:12 | 显示全部楼层
zhepingli 发表于 2013-7-25 09:12
我想如果能写出一个项目应用笔记应该会很实用的啦!楼主若有时间能搞出来当然会很好了!谢谢你的回答! ...

呵呵,要求越来越高了!
我想我会写的!

出0入0汤圆

发表于 2013-7-25 10:08:44 | 显示全部楼层

哈哈 好贴啊   已收藏

出0入0汤圆

发表于 2013-7-25 11:17:38 | 显示全部楼层
已收藏。待稍后学习。

出0入0汤圆

发表于 2013-7-25 11:23:58 | 显示全部楼层
好好研究一下,谢楼主

出0入0汤圆

发表于 2013-7-26 09:42:49 | 显示全部楼层
很好,支持

出0入0汤圆

发表于 2013-7-27 08:15:14 | 显示全部楼层
mark......

出0入0汤圆

发表于 2013-7-27 23:03:54 | 显示全部楼层
本帖最后由 jianglijuan 于 2013-7-27 23:26 编辑

为什么,我只能收到一次数据呢?之后就再也收不到了。

用串口调试软件看到接受到的数据,再返回来了,但是只能一次

用modbus poll 却说illegal data address 然后就是time out

我的程序用的就是LZ的原原本本的程序,一字未改

电路板是STM32ZET6的开发板。

硬件也不应该有问题

这到底是为什么呢?

出0入0汤圆

发表于 2013-7-27 23:04:46 | 显示全部楼层
我的智商已经完全不够用了,求各种辅导~~~~~~~~~~

出0入0汤圆

 楼主| 发表于 2013-7-28 07:13:20 | 显示全部楼层
jianglijuan 发表于 2013-7-27 23:03
为什么,我只能收到一次数据呢?之后就再也收不到了。

用串口调试软件看到接受到的数据,再返回来了,但是 ...

你可以检查一下以下设置



请务必修改读写数量参数,原来为10,但是我的例子中每种寄存器的数量只有8,如果读10个寄存器的话,自然就是非常地址了。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-7-28 07:15:16 | 显示全部楼层
jianglijuan 发表于 2013-7-27 23:04
我的智商已经完全不够用了,求各种辅导~~~~~~~~~~

头像是“刘诗诗”的。还是您长的像刘诗诗。

出0入0汤圆

发表于 2013-7-28 11:47:30 | 显示全部楼层
xukai871105 发表于 2013-7-28 07:13
你可以检查一下以下设置

这是我的设置。

我是持续不断的再发,但是返回一次。能加QQ远程协助一下吗

头像是我本人的照片。长得不像刘诗诗,可能是角度问题。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-7-28 12:00:23 | 显示全部楼层
xukai871105 发表于 2013-7-28 07:13
你可以检查一下以下设置

改为您建议的设置了

你看只能收到一次,后面就收不到了

然后就是time out了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-7-28 13:06:25 | 显示全部楼层
jianglijuan 发表于 2013-7-28 12:00
改为您建议的设置了

你看只能收到一次,后面就收不到了

我看了你回复的两个帖子,至于你长得像不像刘诗诗这个问题就不再讨论了!

调试过程中,串口的设置 和发送的访问命令应该是没有问题的。

问题1 请检查串口是不是为UART1,或者你已经修改了!请确保参数没有问题,特别是校验位在NONE

问题2 寄存器的个数还是保持的默认10,不是建议修改为8而是强制修改为8。
通过Modbus调试的过程,从你的截图来看。
第一次发送01 03 00 00 00 0A C5 CD,说明你没有修改以下参数。


但是我也有疑问了
即使你发送了不合理的00 0A,超过了寄存器访问的范围
那么再次访问还是可以获得一个地址错误的提示,而不是超时的提示。

如果这样的话,在connect菜单点击advanced。请保持与我一致的设置




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-7-28 13:16:36 | 显示全部楼层
xukai871105 发表于 2013-7-28 13:06
我看了你回复的两个帖子,至于你长得像不像刘诗诗这个问题就不再讨论了!

调试过程中,串口的设 ...

上次我没弄好。

重新截图.

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-7-28 14:04:37 | 显示全部楼层
xukai871105 发表于 2013-7-28 13:06
我看了你回复的两个帖子,至于你长得像不像刘诗诗这个问题就不再讨论了!

调试过程中,串口的设 ...

我看了之前一些人的回复,发现也存在类似的问题,在300楼也是。

串口的硬件我用了一个串口的调试程序试过,是好使的。发送和接受都没有问题

USART1 就是com1没有选错的。不然就一个都收不到了。

我不太会调试,求帮忙啊,老板催活催得急啊

出0入0汤圆

发表于 2013-7-28 14:50:34 | 显示全部楼层
xukai871105 发表于 2013-7-28 13:06
我看了你回复的两个帖子,至于你长得像不像刘诗诗这个问题就不再讨论了!

调试过程中,串口的设 ...

亲,我成功啦

哦耶

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-7-28 15:43:14 | 显示全部楼层
jianglijuan 发表于 2013-7-28 14:50
亲,我成功啦

哦耶

你也告诉我发生了什么问题了!
也告诉大家吧!

这个可以调整为浮点数显示,分别为1.11 2.22 3.33和4.44

出0入0汤圆

 楼主| 发表于 2013-7-28 15:45:15 | 显示全部楼层
jianglijuan 发表于 2013-7-28 14:04
我看了之前一些人的回复,发现也存在类似的问题,在300楼也是。

串口的硬件我用了一个串口的调试程序试 ...

“我不太会调试,求帮忙啊,老板催活催得急啊”


难道还在读研究生!

出0入0汤圆

发表于 2013-7-28 19:31:32 | 显示全部楼层

出0入0汤圆

发表于 2013-7-28 21:20:15 | 显示全部楼层
xukai871105 发表于 2013-7-28 15:45
“我不太会调试,求帮忙啊,老板催活催得急啊”

研究生毕业了,在研究所工作呢

我不知道我能不能说清楚:
我之前下了一个版本的freemodbus,
在移植你的程序的时候,只对用了你的Porttimer.c和portserial.c以及main.c
在编译的时候报错说,ENTER_CRITICAL_SECTION(  )这个函数没有定义,
我发现port.h这文件将该函数宏定义为
#define ENTER_CRITICAL_SECTION( )   EnterCriticalSection( )
#define EXIT_CRITICAL_SECTION( )    ExitCriticalSection( )
所以,我就自己把它的定义又粘到我的工程文件里来,编译就通过了
void
EnterCriticalSection( void )
{
  __disable_irq();
}

void
ExitCriticalSection( void )
{
  __enable_irq();
}

后来我中午的时候,想到这个报错,谁都没有在讨论的时候说过,可能就是因为我移植的时候版本不一样(我个人主观猜测的)。
所以,我就把LZ分享的程序完整的重新做了个新的工程,编译果然没有报错,硬件测试成功。

总结一句就是,完完整整的用LZ的程序一般是不会出问题的。(是我自作聪明以为把移植手册看懂了,自己也能移植就开始乱组合,才痛苦了三天)

出0入0汤圆

 楼主| 发表于 2013-8-1 09:34:10 | 显示全部楼层
维护这个帖子快一年了,自己纪念一下!

出0入0汤圆

发表于 2013-8-1 11:55:03 | 显示全部楼层
见到了好贴,正要使用!敢问楼主:


在port.h中,并没有对
#define ENTER_CRITICAL_SECTION( )   
#define EXIT_CRITICAL_SECTION( )  
加以实现,是否会影响协议栈中某些需要进入临界去的功能呢!不解

出0入0汤圆

发表于 2013-8-1 12:52:00 | 显示全部楼层
Baldwin 发表于 2013-3-11 22:30
参考LZ的程序,FreeModbus已经能初步调试了,然后把它加入到我的项目中时出现了问题,特请教lz

在主函数 ...

是不是实时性不够???

出0入0汤圆

 楼主| 发表于 2013-8-1 13:32:24 | 显示全部楼层
mcuzxc 发表于 2013-8-1 11:55
见到了好贴,正要使用!敢问楼主:

是我偷懒了,如果你觉得有必要,完全可以增加该部分内容。

出0入0汤圆

发表于 2013-8-1 15:02:40 | 显示全部楼层
楼主,我把程序改为ASCII方式 就收不到数据了
需要怎么就修改呢,才支持ASCII格式的数据收发!!谢谢

出0入0汤圆

 楼主| 发表于 2013-8-1 15:07:24 | 显示全部楼层
mcuzxc 发表于 2013-8-1 15:02
楼主,我把程序改为ASCII方式 就收不到数据了
需要怎么就修改呢,才支持ASCII格式的数据收发!!谢谢 ...

不好意思,我没有弄过ASCII模式。
请再论坛里面再搜索一下,查看其他人的经验。

抱歉!

出0入0汤圆

发表于 2013-8-1 16:13:14 | 显示全部楼层
这个真是有用啊    有机会向楼主讨教

出0入0汤圆

发表于 2013-8-1 18:31:57 | 显示全部楼层
谢谢楼主的而快速回复!
我又遇见一个问题,这个程序。RTU模式:
15命令:写多个线圈好像不好使。我是用的 modbus poll 测试的!楼主可以测试下这个功能吗?谢谢

出0入0汤圆

发表于 2013-8-1 18:50:14 | 显示全部楼层
如图所示:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-8-1 18:53:17 | 显示全部楼层
本帖最后由 xukai871105 于 2013-8-1 18:54 编辑
mcuzxc 发表于 2013-8-1 18:50
如图所示:


请注意示例代码中

输入寄存器和保持寄存器的个数为8
离散输入寄存器和线圈寄存器的个数位16

你的截图中已显示 response OK。说明请求和响应均成功了。

出0入0汤圆

发表于 2013-8-1 19:02:10 | 显示全部楼层
网速不给力,网页打不开,抱歉!
显示ok说明stm32正常的接受命令 并且正常回复了。但是,我读到的线圈值却如图所示。。。  明显不对

出0入0汤圆

 楼主| 发表于 2013-8-1 20:52:46 | 显示全部楼层
mcuzxc 发表于 2013-8-1 19:02
网速不给力,网页打不开,抱歉!
显示ok说明stm32正常的接受命令 并且正常回复了。但是,我读到的线圈值却 ...

这里是有问题啊!暂时不清楚问题出在哪里
容我仔细调试一下,感谢您的测试。

出0入0汤圆

发表于 2013-8-2 13:22:19 | 显示全部楼层
还是我,楼主,我看你刚发的那个帖子,视频中写多个线圈是正常的,咋回事啊?你没改程序吧。 谢谢。

出0入0汤圆

发表于 2013-8-2 14:53:30 | 显示全部楼层
这就是我的源程序,请楼主帮忙看下,咋回事?还是那个问题 15功能码 谢谢万分

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-8-2 17:17:43 | 显示全部楼层
mcuzxc 发表于 2013-8-2 13:22
还是我,楼主,我看你刚发的那个帖子,视频中写多个线圈是正常的,咋回事啊?你没改程序吧。 谢谢。 ...

我没有修改程序,不过我也感觉到有点问题。可能是modbus poll的问题,我说是可能啊。
我有时间再认真看看。

感觉这几天上班上的好累啊!

出0入198汤圆

发表于 2013-8-3 14:11:27 | 显示全部楼层
仔细看完了整个贴子,结合自己移植的过程,提一下楼主的几个问题
1、IAR6.5编译工程报错
2、之前我使用的是发送中断,用了很久一直没问题,但是改成发送完成中断确实会出现像发第一帧数据正常,之后就始终超时。
我的硬件平台:STM32F103CBT6  操作系统:RT-Thread1.1.1   使用串口1,如果有必要可以和楼主共同解决这个问题

出0入0汤圆

 楼主| 发表于 2013-8-3 16:52:03 | 显示全部楼层
sunnydragon 发表于 2013-8-3 14:11
仔细看完了整个贴子,结合自己移植的过程,提一下楼主的几个问题
1、IAR6.5编译工程报错
2、之前我使用的是 ...

1、IAR6.5编译工程报错
我当时移植的时候还是使用IAR 5.5,使用IAR6.x版本编译都会出错,错误的原因是CMSIS,具体你可以根据错误提示搜索一下。
2、之前我使用的是发送中断,用了很久一直没问题,但是改成发送完成中断确实会出现像发第一帧数据正常,之后就始终超时。
你会所的发送中断(发送寄存器空中断)和发送完成中断都是可以解决问题的。freemodbus默认的是前者,发送寄存器空中断。我使用了发送完成中断,并修改了协议栈中的部分代码,当填充缓冲区之后直接发送一个字节内容,打开发送完成中断。
可能你遇到的问题由以上原因引起。。

祝您调试好运。

出0入198汤圆

发表于 2013-8-3 20:06:31 | 显示全部楼层
xukai871105 发表于 2013-8-3 16:52
1、IAR6.5编译工程报错
我当时移植的时候还是使用IAR 5.5,使用IAR6.x版本编译都会出错,错误的原因是CMS ...

FreeModbus+STM32+UCOS我在10年就已经移植完成,并发布在pudn。。
最近想开源做FreeModbus+ModbusMaster+RTT+STM32,不知楼主有兴趣吗?

出0入0汤圆

 楼主| 发表于 2013-8-4 00:01:24 | 显示全部楼层
sunnydragon 发表于 2013-8-3 20:06
FreeModbus+STM32+UCOS我在10年就已经移植完成,并发布在pudn。。
最近想开源做FreeModbus+ModbusMaster+ ...

认真的回复您:
1.关于modbus master:我也一直想做,但是一直没想好这么做,如何做,如何才可以做好
2.关于RTT 入门过,但是没有实际使用过,里面有很多东西都没有搞清楚
3.关于modbus master 和 slaver:如果要做master ,干脆把slaver一起做了吧
4.关于兴趣,不是兴趣的问题是时间和精力的问题。

出0入0汤圆

发表于 2013-8-4 13:10:27 | 显示全部楼层
mark      

出0入0汤圆

发表于 2013-8-11 09:22:55 来自手机 | 显示全部楼层
mar…
顶一个…

出0入0汤圆

发表于 2013-8-13 14:32:33 | 显示全部楼层
本帖最后由 zhepingli 于 2013-8-13 14:36 编辑
mcuzxc 发表于 2013-8-2 14:53
这就是我的源程序,请楼主帮忙看下,咋回事?还是那个问题 15功能码 谢谢万分 ...


请问楼主:在线圈设置中怎么只能OUT1=ucRegCoilsBuf[0]来设置IO输出口,当换成OUT1=ucRegCoilsBuf[1]后就没有效果了呢?
uint8_t ucRegCoilsBuf[REG_COILS_SIZE / 8] = {0x01,0x02};
。。。。。。
while(1)
        {
                eMBPoll();
                OUT1=ucRegCoilsBuf[1];       
                OUT0=ucRegCoilsBuf[0];
        }

出0入0汤圆

发表于 2013-8-14 16:00:58 | 显示全部楼层
zhepingli 发表于 2013-8-13 14:32
请问楼主:在线圈设置中怎么只能OUT1=ucRegCoilsBuf[0]来设置IO输出口,当换成OUT1=ucRegCoilsBuf[1]后就 ...

首先说明下,我不是楼主,楼主比我牛逼。怎么可能,你说详细点?

出0入0汤圆

发表于 2013-8-14 16:05:11 | 显示全部楼层
再次请问楼主一个问题,使用freemobus,主机读取数据时,自然好说,我们建立个任务不定时的更新那些数组即可;但是主机写数据时,我们是怎么知道的呢,是不是要在eMBPoll()或者哪里建立个标志,来告诉其他程序已经接收到了有效数据,可以处理了。

出0入0汤圆

发表于 2013-8-14 16:06:41 | 显示全部楼层
很好,谢谢!

出0入0汤圆

发表于 2013-8-14 19:29:27 | 显示全部楼层
mcuzxc 发表于 2013-8-2 14:53
这就是我的源程序,请楼主帮忙看下,咋回事?还是那个问题 15功能码 谢谢万分 ...

兄弟你这个程序05功能与02功能接收正常吗?我用你的程序测试05功能只能控制ucRegCoilsBuf[0]有用!其余的线圈就没有受控!是不是这不是你的标准程序啊?方便给一份完整的MODBUS-RTU功能吗能实现 02 03 05 的吗?谢谢了

出0入0汤圆

发表于 2013-8-14 19:43:58 | 显示全部楼层
mcuzxc 发表于 2013-8-14 16:00
首先说明下,我不是楼主,楼主比我牛逼。怎么可能,你说详细点?

朋友:还是那个问题!想问一下你是如何来控制单个线圈的!我在你的程序上加了05置单个线圈咋不好使啊?能给解析下不?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2013-8-14 23:18:51 | 显示全部楼层
真的很不错啊,学习了,顶楼主

出0入0汤圆

发表于 2013-8-15 16:41:55 | 显示全部楼层
学习了。。。。。。

出0入0汤圆

发表于 2013-8-15 19:48:37 | 显示全部楼层
xukai871105 发表于 2013-8-1 20:52
这里是有问题啊!暂时不清楚问题出在哪里
容我仔细调试一下,感谢您的测试。 ...

楼主:又来打扰你了!我想问一下为什么05功能读线圈时只有ucRegCoilsBuf[0]控制的LED 有效,而当我改为ucRegCoilsBuf[1]或者其他数组标号时就没有效果呢?
                        LED0=ucRegCoilsBuf[0]-----------有效
                       LED0=ucRegCoilsBuf[1]-----------无效
                       LED0=ucRegCoilsBuf[2]-----------无效
能帮忙分析下我的程序有处理正确吗?上传附件:

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

 楼主| 发表于 2013-8-15 20:15:36 | 显示全部楼层
zhepingli 发表于 2013-8-15 19:48
楼主:又来打扰你了!我想问一下为什么05功能读线圈时只有ucRegCoilsBuf[0]控制的LED 有效,而当我改为uc ...

我下载了代码查看了,线圈寄存器为位操作
所以ucRegCoilsBuf[0]可对应8个LED
LED0=ucRegCoilsBuf[0] 有点问题!


你可以这么操作存在问题
你可以这样操作
LED0=ucRegCoilsBuf[0] & 0x01
LED1=ucRegCoilsBuf[0] & 0x02

出0入0汤圆

发表于 2013-8-15 21:04:22 | 显示全部楼层
xukai871105 发表于 2013-8-15 20:15
我下载了代码查看了,线圈寄存器为位操作
所以ucRegCoilsBuf[0]可对应8个LED
LED0=ucRegCoilsBuf[0] 有点 ...

恩!谢谢楼主啊!05这个功能可以了!我是参照你的写法:
                   LED_Status = ucRegCoilsBuf[0];
                  if(LED_Status & 0x01) {LED1_ON();} else {LED1_OFF();}
                 if(LED_Status & 0x02) {LED2_ON();} else {LED2_OFF();}
           --------------------------------------------------非常感谢!那我读线圈的话是不是也是这样的方式吗?
---------------------------------------------

出0入0汤圆

 楼主| 发表于 2013-8-15 23:02:02 | 显示全部楼层
zhepingli 发表于 2013-8-15 21:04
恩!谢谢楼主啊!05这个功能可以了!我是参照你的写法:
                   LED_Status = ucRegCoilsBuf ...

以此类推吗,当然是可以的!

出0入0汤圆

发表于 2013-8-17 23:04:47 | 显示全部楼层
帖子太牛逼了,必须顶!

出0入0汤圆

发表于 2013-8-18 18:23:03 | 显示全部楼层
看完了,学了东西,感谢!!

出30入0汤圆

发表于 2013-8-21 23:08:20 | 显示全部楼层
顶一个,楼主是个大好人,佩服佩服!

出0入0汤圆

发表于 2013-8-21 23:54:37 来自手机 | 显示全部楼层
十分感谢楼主

出0入0汤圆

发表于 2013-8-23 00:09:20 | 显示全部楼层
sunnydragon 发表于 2013-8-3 20:06
FreeModbus+STM32+UCOS我在10年就已经移植完成,并发布在pudn。。
最近想开源做FreeModbus+ModbusMaster+ ...

十年前就有STM32了啊,我等真实孤陋寡闻啊

出0入0汤圆

发表于 2013-8-23 10:19:02 | 显示全部楼层
好东西  谢谢分享

出0入0汤圆

 楼主| 发表于 2013-8-23 10:58:31 | 显示全部楼层
aihe 发表于 2013-8-23 00:09
十年前就有STM32了啊,我等真实孤陋寡闻啊

我当时也看傻了!后来我仔细一看是2010年,也就是3年前而不是10年前。

今天收到了国外大学研究生(非中国人)发过来的邮件,询问工程代码的事情。

我详细回复了并提供了代码

他说论坛国外不能注册,因为他没有中国的信用卡,所以只能发邮件。

出0入0汤圆

发表于 2013-8-24 10:51:17 | 显示全部楼层
请教。 用06 命令修改设备地址
     eMBInit(MB_RTU,0x02, 0x01, 9600, MB_PAR_NONE);//重新修改设备ID
        eMBEnable();
再用03命令通讯设备02 提示连接错误,请教不断电,再上电,直接利用软件如何重启?
谢谢!!!!

出0入0汤圆

 楼主| 发表于 2013-8-24 11:48:43 | 显示全部楼层
xukai871105 发表于 2013-8-23 10:58
我当时也看傻了!后来我仔细一看是2010年,也就是3年前而不是10年前。

今天收到了国外大学研究生(非中 ...

Hi  Hsiao Yu Shan

I hope that you can see it.

When I send email to you ,  it failed for many times.

if you fail again please try http://pan.baidu.com/share/link?shareid=502784699&uk=3707837393

if you fail for the third time , please tell me(email me) I will commit the project to github.

================================================================
The original message was received at Fri, 23 Aug 2013 20:34:54 -0700 (PDT)
from m15-19.126.com [220.181.15.19]

   ----- The following addresses had permanent fatal errors -----
vicki19880929@gmail.com
    (reason: 552-5.7.0 This message was blocked because its content presents a potential)
    (expanded from: <yushanh@uci.edu>)

   ----- Transcript of session follows -----
... while talking to gmail-smtp-in.l.google.com.:
>>> DATA
<<< 552-5.7.0 This message was blocked because its content presents a potential
<<< 552-5.7.0 security issue. Please visit http://support.google.com/mail/bin/answe
<<< 552-5.7.0 r.py?answer=6590 to review our message content and attachment content
<<< 552 5.7.0 guidelines. qh6si2414762pac.279 - gsmtp
554 5.0.0 Service unavailable

=================================================================

出0入0汤圆

发表于 2013-8-24 12:00:11 | 显示全部楼层
请教:怎么执行了eMBInit(MB_RTU,0x01, 0x01, 38400, MB_PAR_NONE);或者eMBInit(MB_RTU,0x03, 0x01, 38400, MB_PAR_NONE);就出现Byte Missing Error

出0入0汤圆

 楼主| 发表于 2013-8-24 12:06:00 | 显示全部楼层
SCmianyangZLY 发表于 2013-8-24 10:51
请教。 用06 命令修改设备地址
     eMBInit(MB_RTU,0x02, 0x01, 9600, MB_PAR_NONE);//重新修改设备ID
    ...

我刚开始的时候还没有明白你的意思,后来我发现你想使用指令修改从机地址!

这种情况我的确没有遇到过,而且我不建议你这样做

modbus使用之前就必须配置好从机地址,而且从机地址不能重复。

出0入0汤圆

 楼主| 发表于 2013-8-24 12:07:14 | 显示全部楼层
SCmianyangZLY 发表于 2013-8-24 12:00
请教:怎么执行了eMBInit(MB_RTU,0x01, 0x01, 38400, MB_PAR_NONE);或者eMBInit(MB_RTU,0x03, 0x01, 38400, ...

修改从机地址我一般都使用拨码开关操作

通过拨码开关修改从机地址,然后断点重启

出0入0汤圆

 楼主| 发表于 2013-8-24 12:09:57 | 显示全部楼层
SCmianyangZLY 发表于 2013-8-24 12:00
请教:怎么执行了eMBInit(MB_RTU,0x01, 0x01, 38400, MB_PAR_NONE);或者eMBInit(MB_RTU,0x03, 0x01, 38400, ...

eMBInit(MB_RTU,0x01, 0x01, 38400, MB_PAR_NONE);

我好像使用了固定波特率,您修改为38400没有效果,请修改portserial.c

出0入0汤圆

发表于 2013-8-24 12:10:30 | 显示全部楼层
写得不错!

出0入0汤圆

发表于 2013-8-24 14:25:15 | 显示全部楼层
本帖最后由 yushanh 于 2013-8-24 23:57 编辑
xukai871105 发表于 2013-8-24 11:48
Hi  Hsiao Yu Shan

I hope that you can see it.


Hey Hsu Kai!

I asked my Chinese friend to do the transaction for me today so I could login now.   

Thanks for letting me know!  This is really a great work.  :D

By the way, I found you also work on the Contiki OS port. I just looked into the Contiki OS recently and will try to port it to my STM32 mcu as well in the future.  It would be really helpful.  Thanks a lot for your efforts!

Yu Shan

出0入0汤圆

 楼主| 发表于 2013-8-24 19:04:32 | 显示全部楼层
yushanh 发表于 2013-8-24 14:25
Hey Hsu Kai!

I asked my Chinese friend to do the transaction for me today so I could login now. { ...

Hi

Recently I will do some efforts on Contiki OS.

Contiki OS is a really nice OS for Wireless Sensoring Networks.
But in china a few engineers know it and can use it. In their opinion ZigBee(ZStack) will be a better choice( may be).

I port Contiki to STM32 platform to learn how to use ti.Something as how to create a thread or how to post message to another thread.

But I think in WSN field STM32L(or EFM32) will be a better choice.
Maybe I will try STM32+CC2520 or STM32+Si4432 with Contiki OS some days later.

Modbus over 6Lowpan or CANopen over 6Lowpan is my ultimate aim.

Thank you for your reply.

MyBlog:http://blog.csdn.net/xukai871105.
I hope that you will like it even if all the blog are wirtten in Chinese.

出0入0汤圆

发表于 2013-8-25 11:58:27 | 显示全部楼层
谢谢!楼主指教。

出0入0汤圆

发表于 2013-8-25 12:12:44 | 显示全部楼层
好高深啊。。。

出0入0汤圆

发表于 2013-8-26 23:10:20 | 显示全部楼层
本帖最后由 yushanh 于 2013-8-27 10:19 编辑

I wonder if the LED/button poll functions work?  You have commented out in the main.c.  How shall I use it?  Thanks!

出0入0汤圆

发表于 2013-8-26 23:11:47 | 显示全部楼层
xukai871105 发表于 2013-8-24 19:04
Hi

Recently I will do some efforts on Contiki OS.

Great! I'll take a look at it later.  I'm using the STM32L mcu as well.

出0入0汤圆

发表于 2013-8-27 09:23:14 | 显示全部楼层
本帖最后由 yushanh 于 2013-8-27 09:35 编辑
xukai871105 发表于 2013-4-25 15:53
RS232 RS485通用

RS485使用的时候需要增加一个收发控制IO!


I'm using the RS232, but my code still didn't work.  The ModbusPoll switched back and forth between "Timeout Error", "Read error: Break condition", and "Write error: Break condition".

Do I need to remove/add/modify anything else other than the following?  
- Remove the configuration of the third pin (GPIOD.8)
- Change USART_IT_TC to USART_IT_TXE

Here are my settings in ModbusPoll master software:
9600-8-N-1-no flow control
Slave ID = 1
Function: 03
Address: 0
Quantity: 8



Hope you could help!


P.S. I also changed other configurations for GPIO and USART because I used the STM32L chip. I already tested the UART serial function and LED function, and both of them work fine.


出0入0汤圆

 楼主| 发表于 2013-8-27 13:43:37 | 显示全部楼层
yushanh 发表于 2013-8-27 09:23
I'm using the RS232, but my code still didn't work.  The ModbusPoll switched back and forth betwee ...


- Remove the configuration of the third pin (GPIOD.8)
    Do not care about this pin.
- Change USART_IT_TC to USART_IT_TXE
   I advise you dont change it.

I think is will be something wrong in porttime.c

出0入0汤圆

发表于 2013-8-28 14:51:11 | 显示全部楼层
整个帖子从头看到尾,刚接触modbus,似懂非懂,但还是学到很多东西,谢谢各位

出0入0汤圆

发表于 2013-8-28 15:31:47 | 显示全部楼层
使用后发现FreeModbus用在STM32上面效率偏低,而且还会偶发性的出错。

出0入0汤圆

发表于 2013-8-28 15:46:03 | 显示全部楼层

出0入0汤圆

发表于 2013-8-28 15:48:54 | 显示全部楼层
很不错的文章呀,值得一看

出0入0汤圆

发表于 2013-8-28 16:15:18 | 显示全部楼层
好贴   学习了      

出0入0汤圆

 楼主| 发表于 2013-8-29 12:47:03 | 显示全部楼层
guzhongqi 发表于 2013-8-28 15:31
使用后发现FreeModbus用在STM32上面效率偏低,而且还会偶发性的出错。

如果觉得FreeModbus效率偏低,请问您是如何度量这个效率的,如果您已经度量这个效率了,请问和什么比较得出的结论。

再问,如果存在偶然性错误,请问根据您的测试结果,偶然性错误发生在哪些问题,我们好一起改正做到完美。

出0入0汤圆

发表于 2013-8-29 14:29:44 | 显示全部楼层
xukai871105 发表于 2013-8-29 12:47
如果觉得FreeModbus效率偏低,请问您是如何度量这个效率的,如果您已经度量这个效率了,请问和什么比较得 ...

STM32是可以用DMA收发的,FreeModbus用的是收发中断,一个字符一个字符的去处理,占用CPU时间肯定多,
而且我用的STM32F3和STM32F0都有串口超时中断,FreeModbus是用定时器实现超时判断的。
通信占用CPU时间越少,CPU就有越多的时间去处理其他任务,特别是当有多路串口同时通信的时候更明显。
我用自己写的Modbus和FreeModbus对比过,长时间通信(48小时以上每隔200ms读取50个寄存器),其他测试条件都一样,
FreeModbus出现数百次通信异常,而我自己写的一次都没有出现。
本来是觉得FreeModbus的实现指令比较完整,想借用一下,后来只能放弃,用自己写的Modbus,虽然指令不完整但也够用了。
还有就是FreeModbus只能实现从机的功能,Modbus主机也有很多场合用,只能自己去实现。
说实话Modbus的主机实现要复杂一点,特别是要实现多机通信,随机性的读写指令混合的时候。

出0入0汤圆

发表于 2013-8-30 23:05:29 | 显示全部楼层
好贴 FREEMODBUS

出0入0汤圆

发表于 2013-9-2 22:48:08 | 显示全部楼层
收藏一下,不错。

出0入0汤圆

发表于 2013-9-2 23:11:36 | 显示全部楼层
哎哟,我来晚了吗

出0入0汤圆

发表于 2013-9-3 09:32:25 | 显示全部楼层
楼主牛人,标记,FreeModbus移植

出0入0汤圆

 楼主| 发表于 2013-9-3 15:20:16 | 显示全部楼层
jackwang123 发表于 2013-9-2 23:11
哎哟,我来晚了吗

头像不错啊!

出0入0汤圆

发表于 2013-9-5 04:43:38 | 显示全部楼层
Does anyone ever implement the Modbus protocol through USB instead of UART?
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-18 17:50

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

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