搜索
bottom↓
楼主: sunnydragon

【开源】自己重构的FreeModbus主机+从机协议栈

  [复制链接]

出0入0汤圆

发表于 2014-12-7 17:34:27 | 显示全部楼层
刚看到。不错啊,大赞

出0入0汤圆

发表于 2015-1-4 15:50:37 | 显示全部楼层
谢谢 有用

出0入0汤圆

发表于 2015-1-4 21:38:51 | 显示全部楼层
早几天发现
就用你的啦

出0入0汤圆

发表于 2015-1-4 23:18:55 | 显示全部楼层
是在RTT上的,有没有裸机的,呵呵,我比较懒和笨

出0入0汤圆

发表于 2015-1-12 13:29:07 | 显示全部楼层
学习学习,感谢楼主

出0入0汤圆

发表于 2015-1-22 12:06:19 | 显示全部楼层
XIUQIN 发表于 2014-10-6 17:10
请问前辈,针对从机的0X03读保持寄存器和0X10写多个寄存器,这两个功能码操作的都是保持寄存器,我想若是分 ...

大牛 能分享一个ucos-II 版本的不?

出0入0汤圆

发表于 2015-1-22 13:21:25 | 显示全部楼层
MODUSBUS  用的挺多的。 但是就是自己还不会用。。

出0入0汤圆

发表于 2015-1-22 14:07:49 | 显示全部楼层
楼主移植了ucos-ii版本的了吗? 对rtt不太懂,看起来好费劲呀

出0入198汤圆

 楼主| 发表于 2015-1-23 13:06:01 | 显示全部楼层
lyricpoem0726 发表于 2015-1-22 14:07
楼主移植了ucos-ii版本的了吗? 对rtt不太懂,看起来好费劲呀

有网友移植我的项目到Ucos上去了,你加我QQ我发给我(见签名)

出0入0汤圆

发表于 2015-1-23 13:54:25 | 显示全部楼层
lyricpoem0726 发表于 2015-1-22 12:06
大牛 能分享一个ucos-II 版本的不?

移值得不太好,主要在AFL V3板子上跑的

出0入0汤圆

发表于 2015-1-23 13:57:09 | 显示全部楼层
XIUQIN 发表于 2015-1-23 13:54
移值得不太好,主要在AFL V3板子上跑的

很多需要改进的地方,能力有限!

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-1-23 14:11:16 | 显示全部楼层
XIUQIN 发表于 2015-1-23 13:57
很多需要改进的地方,能力有限!

谢谢了,我观摩一下!

出0入0汤圆

发表于 2015-1-23 15:19:35 | 显示全部楼层
谢谢  分享。。Modbus协议在工控领域运用广泛

出0入0汤圆

发表于 2015-1-27 11:02:53 | 显示全部楼层
modbus 中保持寄存器等里的数据是如何刷新的?  一般是不是定时刷新???

出0入0汤圆

发表于 2015-1-27 11:23:30 | 显示全部楼层
正需要主机,楼主辛苦了!谢谢!

出0入198汤圆

 楼主| 发表于 2015-1-27 13:03:22 | 显示全部楼层
qdyuyan 发表于 2015-1-27 11:23
正需要主机,楼主辛苦了!谢谢!

听懂你的意思,你说的是主机还是从机?

出0入0汤圆

发表于 2015-1-27 13:09:37 | 显示全部楼层
现在对这方面在关注

出0入0汤圆

发表于 2015-1-27 13:12:22 | 显示全部楼层
是主机,

出0入198汤圆

 楼主| 发表于 2015-1-27 13:16:03 | 显示全部楼层

晕~回复错人了

出0入198汤圆

 楼主| 发表于 2015-1-27 13:16:19 | 显示全部楼层
lyricpoem0726 发表于 2015-1-27 11:02
modbus 中保持寄存器等里的数据是如何刷新的?  一般是不是定时刷新???

听懂你的意思,你说的是主机还是从机?

出0入0汤圆

发表于 2015-1-27 14:01:16 | 显示全部楼层
sunnydragon 发表于 2015-1-27 13:16
听懂你的意思,你说的是主机还是从机?

我还没有看主机,但是我觉得不管从机还是主机,都应该会更新保存寄存器的值吧,假如我要将采集到的数据存到保存寄存器,然后通过modbus传给上位机?
那么保存寄存器的值怎么更新比较好呢?我一般是定时刷新的,不知道有没有更好的方法。

出0入198汤圆

 楼主| 发表于 2015-1-27 15:06:23 | 显示全部楼层
lyricpoem0726 发表于 2015-1-27 14:01
我还没有看主机,但是我觉得不管从机还是主机,都应该会更新保存寄存器的值吧,假如我要将采集到的数据存 ...


不知道你说的这个保持寄存器是不是指代单片机中Modbus数据缓冲区中的数据,还是上位机显示的保持寄存器。
如果单片机是从机,那么你需要定时把你的数据更新到保持寄存器的缓冲区中,此时上位机什么时候去读取这个保持寄存器,那是上位机的事情。
如果单片机是主机,可以定时调用主机请求读取保持寄存器的接口,请求一次你就会获取一次最新的数据。

出0入0汤圆

发表于 2015-1-27 16:20:41 | 显示全部楼层
sunnydragon 发表于 2015-1-27 15:06
不知道你说的这个保持寄存器是不是指代单片机中Modbus数据缓冲区中的数据,还是上位机显示的保持寄存器。 ...

非常感谢,我明白了!

出0入0汤圆

发表于 2015-1-28 16:40:51 | 显示全部楼层
不粗,很强大

出0入0汤圆

发表于 2015-2-3 21:14:50 | 显示全部楼层
谢谢分享,标记

出0入0汤圆

发表于 2015-2-7 08:28:03 | 显示全部楼层
好资料,学习了

出0入0汤圆

发表于 2015-2-7 08:35:24 | 显示全部楼层
好东西,学习了

出0入0汤圆

发表于 2015-2-9 22:34:11 | 显示全部楼层
感谢分享

出0入0汤圆

发表于 2015-2-9 22:43:27 | 显示全部楼层
厉害,顶

出0入0汤圆

发表于 2015-2-12 08:05:43 | 显示全部楼层
不错,谢谢分享

出5入42汤圆

发表于 2015-2-12 09:11:42 | 显示全部楼层
好好好,又是一个可以学习的项目

出0入0汤圆

发表于 2015-3-4 08:32:07 | 显示全部楼层
请问前辈!modbus RTU从机中的保持寄存器在读写时需要做互斥处理吧?FreeMobus底层好像没有实现。比如我有个实时时钟的数据(年月,日时,分秒)定期的在从机中刷入3个保持寄存器中,上位机会随机的一次读取这些不断更新的3个数据作为时间戳,这时我就想到若是我在写一半数据时,上位机来读取了,这时我还没刷新完,数据的完整性会有问题。现在想到的只有使用互斥信号量来解决,但要改动FreeModbus的底层,现在我不想去这样做,想保证底层的完整,不知前辈有何建议,谢谢!

出0入0汤圆

发表于 2015-3-4 08:45:12 | 显示全部楼层
MARK感谢楼主,最近正好要用MODBUS

出0入198汤圆

 楼主| 发表于 2015-3-4 20:31:11 | 显示全部楼层
XIUQIN 发表于 2015-3-4 08:32
请问前辈!modbus RTU从机中的保持寄存器在读写时需要做互斥处理吧?FreeMobus底层好像没有实现。比如我有个 ...

我感觉没有必要这样做吧。重点要保证其他代码写这3个保证寄存器的速度足够快,代码紧凑度可以提高一些,同时尽量不要在中断中执行写的操作,更极端的方法就是,写前关闭中断,写完之后再打开。这样保证在读取保持寄存器的值的时候CPU不会被打断,数据自然就完整了。

出0入0汤圆

发表于 2015-3-4 22:12:37 | 显示全部楼层
还没有用过主机协议栈,以后可能要上主机硬件模块,如果还保留modbus组网能力,楼主这个就帮上大忙了,看楼主的意思,是不是没有差错处理?

出0入0汤圆

发表于 2015-3-4 22:27:03 | 显示全部楼层
做的项目正需要相关知识

出0入198汤圆

 楼主| 发表于 2015-3-4 22:31:57 | 显示全部楼层
fengban 发表于 2015-3-4 22:12
还没有用过主机协议栈,以后可能要上主机硬件模块,如果还保留modbus组网能力,楼主这个就帮上大忙了,看楼 ...

你的“差错处理”具体指的是什么?

出0入0汤圆

发表于 2015-3-5 08:28:41 | 显示全部楼层
sunnydragon 发表于 2015-3-4 22:31
你的“差错处理”具体指的是什么?

应该说是异常处理吧,比如从机返回数据异常之类的

出0入198汤圆

 楼主| 发表于 2015-3-5 10:56:15 | 显示全部楼层
fengban 发表于 2015-3-5 08:28
应该说是异常处理吧,比如从机返回数据异常之类的

支持的哦~请仔细查看文档说明。

出0入198汤圆

 楼主| 发表于 2015-3-5 11:05:48 | 显示全部楼层
大家注意下,代码以在Github,OSChina上是最新的。建议使用最新代码,最新代码在稳定性及功能上都有增加。
Github: https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32
OSChina: http://git.oschina.net/armink/FreeModbus_Slave-Master-RTT-STM32

出0入0汤圆

发表于 2015-3-5 22:32:45 | 显示全部楼层
不错  顶起

出0入0汤圆

发表于 2015-3-6 07:53:00 | 显示全部楼层
楼主强,厉害呀,

出0入0汤圆

发表于 2015-3-31 18:18:11 | 显示全部楼层
本帖最后由 XIUQIN 于 2015-3-31 18:24 编辑

你好!发现一个问题 。当主机使用功能码16去向2000的地址写一个数时,数是写到从机了,但从机正确的响应却被主机认为响应功能出错。经查发现在功能码16的函数eMBMasterFuncWriteMultipleHoldingRegister()里 调用了eMBMasterRegHoldingCB()这个函数,而其里面有个这个判断if ((usAddress >= REG_HOLDING_START)&& (usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS)),需要屏蔽(usAddress + usNRegs <= REG_HOLDING_START + REG_HOLDING_NREGS)才可正常。经试验发现要么在使用写多个保持寄存器时给的起始地址形参小于它才行#define M_REG_HOLDING_NREGS  900  这个定义的从机缓存。也就是说请求的地址需小于从机的缓存。表达的不好。
            

出0入198汤圆

 楼主| 发表于 2015-3-31 21:21:45 | 显示全部楼层
本帖最后由 sunnydragon 于 2015-3-31 21:22 编辑
XIUQIN 发表于 2015-3-31 18:18
你好!发现一个问题 。当主机使用功能码16去向2000的地址写一个数时,数是写到从机了,但从机正确的响应却 ...


地址为2000的寄存器,REG_HOLDING_START 与REG_HOLDING_NREGS你分别设置为多少?

出0入0汤圆

发表于 2015-4-1 08:24:41 | 显示全部楼层
本帖最后由 XIUQIN 于 2015-4-1 11:53 编辑
sunnydragon 发表于 2015-3-31 21:21
地址为2000的寄存器,REG_HOLDING_START 与REG_HOLDING_NREGS你分别设置为多少?



地址为2000的寄存器,REG_HOLDING_START = M_REG_HOLDING_START;//M_REG_HOLDING_START默认的是0          REG_HOLDING_NREGS = M_REG_HOLDING_NREGS;//M_REG_HOLDING_NREGS设定为0X38E

(1)在功能码16的回调函数里eMBMasterFuncWriteMultipleHoldingRegister( UCHAR * pucFrame, USHORT * usLen )       pucFrame这时是带入的接收帧缓存地址,但这个值并没有在函数里使用。 其里面的这个判断 if( ucRegByteCount == 2 * usRegCount )  也只是在判断发送帧。
(2)eMBMasterFuncWriteMultipleHoldingRegister()使写入从机的有效寄存器值又同样的在主机的从机缓存里做了一个同样的映射(起始地址和值)。所以当主机通过功能码16写从机保持寄存器的空间大于主机为从机预设的缓存时照成报错。不知理解的对不。

出0入4汤圆

发表于 2015-4-1 08:27:08 | 显示全部楼层
FreeModbus主机+从机

出0入0汤圆

发表于 2015-4-1 09:13:45 | 显示全部楼层
这个必须的支持啊

出0入198汤圆

 楼主| 发表于 2015-4-1 11:50:48 | 显示全部楼层
XIUQIN 发表于 2015-4-1 08:24
地址为2000的寄存器,REG_HOLDING_START = M_REG_HOLDING_START;//M_REG_HOLDING_START默认的是0       ...

地址为2000的寄存器,如果你设定REG_HOLDING_START = 0,REG_HOLDING_NREGS = 0X38E(十进制:910),那么地址范围就只能是0-910,2000都超出范围了。

出0入0汤圆

发表于 2015-4-1 13:24:29 | 显示全部楼层
sunnydragon 发表于 2015-4-1 11:50
地址为2000的寄存器,如果你设定REG_HOLDING_START = 0,REG_HOLDING_NREGS = 0X38E(十进制:910),那 ...

请问前辈,功能码16写多个保持寄存器为何需要将写入从机的数据再在主机的保持寄存器里做个映像呢?要是主机操作的从机保持寄存器地址范围很宽,而主机的RAM有限的情况是无法建立与其一样大小的保持寄存器空间。例如,我要求需要联机的从机保持寄存器0-1000给我只读的,而要求2000-3000只是用来写命令数据的。主机RAM需要保存多个读到的从机数据,而与主机联机的从机RAM可以开的很大,因其只要照顾自己。

出0入198汤圆

 楼主| 发表于 2015-4-2 10:04:12 | 显示全部楼层
XIUQIN 发表于 2015-4-1 13:24
请问前辈,功能码16写多个保持寄存器为何需要将写入从机的数据再在主机的保持寄存器里做个映像呢?要是主 ...

因为设计之初就是为了缓存从机的数据,方便应用层去访问。
后期我还会可以增加缓冲区开关,直接通过主机请求API返回获取到的从机数据。

出0入0汤圆

发表于 2015-4-2 11:23:07 | 显示全部楼层
本帖最后由 XIUQIN 于 2015-4-2 11:25 编辑
sunnydragon 发表于 2015-4-2 10:04
因为设计之初就是为了缓存从机的数据,方便应用层去访问。
后期我还会可以增加缓冲区开关,直接通过主机 ...


噢如此啊,谢谢!也就是需要保存上次下发给从机的数据,以便实时在本地就可查询从机状态。

出0入8汤圆

发表于 2015-4-2 11:50:24 | 显示全部楼层
谢谢大神,,帮了我很大的忙

出0入0汤圆

发表于 2015-4-2 13:25:15 | 显示全部楼层
谢谢楼主分享。

出0入0汤圆

发表于 2015-4-6 14:53:07 | 显示全部楼层
请问前辈:输入寄存器的回调函数里这句可否屏蔽呢?看了官方的也有这条。
eMBException
eMBFuncReadInputRegister( UCHAR * pucFrame, USHORT * usLen )
{
    USHORT          usRegAddress;
    USHORT          usRegCount;
    UCHAR          *pucFrameCur;

    eMBException    eStatus = MB_EX_NONE;
    eMBErrorCode    eRegStatus;

    if( *usLen == ( MB_PDU_FUNC_READ_SIZE + MB_PDU_SIZE_MIN ) )
    {
        usRegAddress = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF] << 8 );
        usRegAddress |= ( USHORT )( pucFrame[MB_PDU_FUNC_READ_ADDR_OFF + 1] );
        
//     usRegAddress++;   //原创是有这条的但会造成设定10个输入寄存器却只能读取9个(地址偏移了一个,少一个,0地址读不到)

出0入0汤圆

发表于 2015-4-13 14:19:00 | 显示全部楼层
FreeModbus,好

出0入0汤圆

发表于 2015-4-14 18:49:36 | 显示全部楼层
是用命令队列加回调吗

出0入0汤圆

发表于 2015-4-14 19:45:01 | 显示全部楼层
mark                       

出0入0汤圆

发表于 2015-4-22 16:03:10 | 显示全部楼层
想学学modbus,感谢分享!

出0入0汤圆

发表于 2015-5-28 08:29:46 | 显示全部楼层
请问前辈功能码03请求帧里的请求数量用一个寄存器表示,也就是按说可一次请求65545个寄存器。但标准里好像只允许一次只能请求125个寄存器。用modbus POLL测试也只给请求125个,那为何请求数量用两个字节呢?

出0入198汤圆

 楼主| 发表于 2015-5-28 08:59:35 | 显示全部楼层
XIUQIN 发表于 2015-5-28 08:29
请问前辈功能码03请求帧里的请求数量用一个寄存器表示,也就是按说可一次请求65545个寄存器。但标准里好像 ...


你确认标准一次最多请求125个寄存器?请贴图出来

出0入0汤圆

发表于 2015-5-28 14:07:22 | 显示全部楼层
sunnydragon 发表于 2015-5-28 08:59
你确认标准一次最多请求125个寄存器?请贴图出来

这个资料是位老师傅给我的。

本帖子中包含更多资源

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

x

出0入198汤圆

 楼主| 发表于 2015-5-28 14:32:28 | 显示全部楼层
XIUQIN 发表于 2015-5-28 14:07
这个资料是位老师傅给我的。

恩~确实是这样。不清楚协议为什么这样设定,我们只能按照协议上规定的实现就好了,这样才能保证我们的协议栈兼容所有设备。。

出0入0汤圆

发表于 2015-5-28 14:46:53 | 显示全部楼层
个人理解是不是防止过长的一帧若是出错,需要全部重发带来效率问题。

出0入0汤圆

发表于 2015-5-28 14:53:31 | 显示全部楼层
sunnydragon 发表于 2015-5-28 14:32
恩~确实是这样。不清楚协议为什么这样设定,我们只能按照协议上规定的实现就好了,这样才能保证我们的协 ...

我现在的做法是若需要请求大于125的一包数据时,只有做分片请求处理。有点像以太网的链路层最大只能一帧传1500个字节,但TCP传输层的数据段却可达到上万字节,其也做了分片处理来满足链路层的限制。

出0入198汤圆

 楼主| 发表于 2015-5-28 15:07:01 | 显示全部楼层
XIUQIN 发表于 2015-5-28 14:53
我现在的做法是若需要请求大于125的一包数据时,只有做分片请求处理。有点像以太网的链路层最大只能一帧 ...


如果你要用Modbus协议,那就协议怎么规定的就怎么做。
你有新的想法,可以按照你的想法自己再设计新的协议及软件即可。

出0入0汤圆

发表于 2015-5-28 16:30:46 | 显示全部楼层
sunnydragon 发表于 2015-5-28 15:07
如果你要用Modbus协议,那就协议怎么规定的就怎么做。
你有新的想法,可以按照你的想法自己再设计新的协 ...

谢谢!

出0入0汤圆

发表于 2015-6-3 20:08:37 | 显示全部楼层
写的很 好  ,赞一个  !

出0入0汤圆

发表于 2015-6-3 20:38:32 | 显示全部楼层
XIUQIN 发表于 2015-4-1 13:24
请问前辈,功能码16写多个保持寄存器为何需要将写入从机的数据再在主机的保持寄存器里做个映像呢?要是主 ...

你好 ,请问 用16功能码写寄存器 ,在程序中 那里写的 ?
我想主机启动后 ,用16功能码 写一帧数据给从机 ,测试一下  !

出0入198汤圆

 楼主| 发表于 2015-6-3 21:44:35 | 显示全部楼层
qs6361036 发表于 2015-6-3 20:38
你好 ,请问 用16功能码写寄存器 ,在程序中 那里写的 ?
我想主机启动后 ,用16功能码 写一帧数据给从机 ...

https://github.com/armink/FreeMo ... /src/app_task.c#L60
打开这个注释,使用这个方法就可以写多个寄存器了

出0入0汤圆

发表于 2015-6-3 21:46:30 | 显示全部楼层
sunnydragon 发表于 2015-6-3 21:44
https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32/blob/master/APP/src/app_task.c#L60
打 ...

楼主好人啊  ,谢谢啦 !

出0入0汤圆

发表于 2015-6-4 17:10:40 | 显示全部楼层
顶顶顶,现在正在搞FreeModbus!

出0入0汤圆

发表于 2015-6-4 17:26:06 | 显示全部楼层
楼主,你好,想学习一下这个modbus,有简易的,或者的虚拟的平台不,

出0入198汤圆

 楼主| 发表于 2015-6-4 20:45:01 | 显示全部楼层
maimaige 发表于 2015-6-4 17:26
楼主,你好,想学习一下这个modbus,有简易的,或者的虚拟的平台不,

目前只有STM32平台的Demo,你可以移植到其他平台进行测试。

出0入0汤圆

发表于 2015-6-5 09:26:35 | 显示全部楼层
sunnydragon 发表于 2015-6-4 20:45
目前只有STM32平台的Demo,你可以移植到其他平台进行测试。

你好,学习这个,用PC机和 STM32就可以学不,具体还需要买什么器件?

出0入0汤圆

发表于 2015-6-10 20:11:52 | 显示全部楼层
sunnydragon 发表于 2015-4-1 11:50
地址为2000的寄存器,如果你设定REG_HOLDING_START = 0,REG_HOLDING_NREGS = 0X38E(十进制:910),那 ...

楼主你好 !
发现REG_HOLDING_NREGS  地址范围不够大 。比如 ,正在调试富士电机 ,位置地址达到0x5101 。这样的话 ,就不能写入咯 !

出0入198汤圆

 楼主| 发表于 2015-6-10 21:49:44 | 显示全部楼层
本帖最后由 sunnydragon 于 2015-6-10 21:51 编辑
qs6361036 发表于 2015-6-10 20:11
楼主你好 !
发现REG_HOLDING_NREGS  地址范围不够大 。比如 ,正在调试富士电机 ,位置地址达到0x5101  ...


不会吧,你的起始地址设置了没有,默认起始地址是0。

出0入0汤圆

发表于 2015-6-11 08:32:42 | 显示全部楼层
sunnydragon 发表于 2015-6-10 21:49
不会吧,你的起始地址设置了没有,默认起始地址是0。

起始地址改为 0x1000 ,M_REG_HOLDING_NREGS改为0x3000 或者0x5000  。

都是出现报错 ,Error: L6406E: No space in execution regions with .ANY selector matching user_mb_app_m.o(.bss).

这是不是地址超过范围啦 ?

出20入62汤圆

发表于 2015-8-22 23:50:46 | 显示全部楼层
想学习modbus 这个厉害  mark一下先

出0入0汤圆

发表于 2015-8-24 07:25:38 | 显示全部楼层
这个必须支持啊

出0入0汤圆

发表于 2015-8-24 11:23:14 | 显示全部楼层
好东西必须顶上

出0入0汤圆

发表于 2015-9-18 08:24:47 | 显示全部楼层
谢谢分享!!!!

出0入0汤圆

发表于 2015-10-1 12:20:40 | 显示全部楼层
有没有遇到这种问题的?  怎么解决呀

本帖子中包含更多资源

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

x

出0入0汤圆

发表于 2015-10-1 13:46:24 | 显示全部楼层
谢谢楼主分享,学习一下

出0入0汤圆

发表于 2015-10-6 08:22:57 | 显示全部楼层
sunnydragon 发表于 2015-3-5 11:05
大家注意下,代码以在Github,OSChina上是最新的。建议使用最新代码,最新代码在稳定性及功能上都有增加。
...

楼主分享精神真好,时隔2年仍然回复并更新

出0入0汤圆

发表于 2015-10-6 08:34:20 | 显示全部楼层
感谢楼主分享

出0入0汤圆

发表于 2015-10-6 08:36:51 | 显示全部楼层
305546594 发表于 2015-10-1 12:20
有没有遇到这种问题的?  怎么解决呀

你这个问题是不是keil版本太低造成的,你的keil什么版本的?

出0入0汤圆

发表于 2015-10-8 14:08:09 | 显示全部楼层
您好!
看了freemodbus主站的代码,受益匪浅!谢谢

有一个地方,没看明白,还请赐教. 作为主站, freemodbus是怎么发出第一个查询帧的?

eMBMasterInit和eMBMasterEnable执行完之后,  串口处于接收数据的状态,定时器开始运行并进行第一次中断后,定时器关闭
此时,     eRcvState = STATE_M_RX_INIT;
             eSndState = STATE_M_TX_IDLE;(执行完第一次定时器中断)
             eMasterQueuedEvent=EV_MASTER_READY
                               
然后执行eMBMasterPoll,由于eMasterQueuedEvent=EV_MASTER_READY, 所以执行完eMBMasterPoll后,并没有发出第一个查询帧,

请问,freemodbus是怎么发出第一个查询帧的? 请指教,  谢谢!

由于不懂RTT,楼主github上的代码,也没去看.

出0入198汤圆

 楼主| 发表于 2015-10-8 20:07:54 | 显示全部楼层
interstellar_tr 发表于 2015-10-8 14:08
您好!
看了freemodbus主站的代码,受益匪浅!谢谢

1、“查询帧”是什么意思?

2、文档和Demo都写的对于使用方法都写的很详细,建议务必要查看Demo和文档,Github:https://github.com/armink/FreeModbus_Slave-Master-RTT-STM32 如果打不开也可以看下我在CSDN上的博客:http://blog.csdn.net/arminkztl/article/details/11738395

出0入0汤圆

发表于 2015-10-8 21:13:54 | 显示全部楼层
sunnydragon 发表于 2015-10-8 20:07
1、“查询帧”是什么意思?

2、文档和Demo都写的对于使用方法都写的很详细,建议务必要查看Demo和文档, ...

谢谢回复!

485的网络,是主从式的,一个主机和多个从机,主机查询从机,然后从机回应,就是查询帧和应答帧

出0入198汤圆

 楼主| 发表于 2015-10-9 07:49:33 | 显示全部楼层
interstellar_tr 发表于 2015-10-8 21:13
谢谢回复!

485的网络,是主从式的,一个主机和多个从机,主机查询从机,然后从机回应,就是查询帧和应 ...

在我的协议栈里分别对应请求和响应,如果需要发送请求,请查看文档中的请求API

出0入0汤圆

发表于 2015-10-9 09:42:24 | 显示全部楼层
sunnydragon 发表于 2015-10-9 07:49
在我的协议栈里分别对应请求和响应,如果需要发送请求,请查看文档中的请求API ...

谢谢你!

出0入0汤圆

发表于 2015-11-9 11:02:24 | 显示全部楼层
请问下楼主,mbfuncholding.c里eMBException
eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usLen )有一段
usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF] << 8 );
usRegCount = ( USHORT )( pucFrame[MB_PDU_FUNC_READ_REGCNT_OFF + 1] );是忘了加|=还是原来就是如此的?

出0入198汤圆

 楼主| 发表于 2015-11-9 18:50:35 | 显示全部楼层
lzly0302 发表于 2015-11-9 11:02
请问下楼主,mbfuncholding.c里eMBException
eMBFuncReadHoldingRegister( UCHAR * pucFrame, USHORT * usL ...


好眼力~
我对比sourceforge上的源码http://sourceforge.net/projects/freemodbus.berlios/ 也有这个问题,这应该是FreeModbus官方从机一直遗留的bug。

出0入0汤圆

发表于 2015-11-19 21:32:29 | 显示全部楼层
mark一下,这个贴子有点意思。

出0入0汤圆

发表于 2015-11-20 09:54:00 | 显示全部楼层
老大,这句是不是有点问题?

本帖子中包含更多资源

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

x

出0入198汤圆

 楼主| 发表于 2015-11-20 19:08:25 | 显示全部楼层
xh2008email 发表于 2015-11-20 09:54
老大,这句是不是有点问题?

什么问题?

出0入0汤圆

发表于 2015-11-20 21:04:32 | 显示全部楼层

如果同时出现一个以上的错误时,你只统计了一个错误,是不是?

出0入198汤圆

 楼主| 发表于 2015-11-21 08:00:05 | 显示全部楼层
本帖最后由 sunnydragon 于 2015-11-21 08:08 编辑
xh2008email 发表于 2015-11-20 21:04
如果同时出现一个以上的错误时,你只统计了一个错误,是不是?


只发送一个主机请求API是不会“同时出现一个以上的错误”,所有的错误码在时间上都是互斥的。

还有,为什么说只统计了一个错误??是不是你对 MB_MBR_NO_ERR 没有理解?

出0入0汤圆

发表于 2015-11-21 13:16:14 | 显示全部楼层
本帖最后由 xh2008email 于 2015-11-21 13:18 编辑

出0入0汤圆

发表于 2015-11-21 13:18:55 | 显示全部楼层
sunnydragon 发表于 2015-11-21 08:00
只发送一个主机请求API是不会“同时出现一个以上的错误”,所有的错误码在时间上都是互斥的。

还有,为 ...

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

本版积分规则

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

GMT+8, 2024-4-26 16:52

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

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