worldsing 发表于 2013-7-26 18:20:37

FreeModBus for AVR IAR工程

M128
PD3 INT3/TXD1
PD2 INT2/RXD1

9600 8 N 1 与 Modbus Poll连接地址为1

通信过程中PA7 LED闪烁

为了减小代码空间目前只来了寄存器读与写功能

可以通过头文件打开其它功能

IAR 5.40环境下 代码尺寸为3.8K

yyj_sd 发表于 2013-7-26 18:27:10

好东西,顶起。。。。。

worldsing 发表于 2013-7-26 18:31:20

之前自己用if自己写的MOdbus不是特别稳定
配置起来还费劲,直接用别人现成的
在ATMEGA8上用它应该没有压力。

handshake 发表于 2013-8-6 13:59:56

正需要,多谢!

worldsing 发表于 2013-8-8 17:48:47

本帖最后由 worldsing 于 2013-8-8 17:53 编辑

再传一个精简版本的:

worldsing 发表于 2013-8-8 17:49:27

本帖最后由 worldsing 于 2013-8-8 17:50 编辑

1、硬件连接:
M128
PD3 INT3/TXD1---> PC 232COM Pin 2
PD2 INT2/RXD1---> PC 232COM Pin 3
GND                  ---> PC 232COM Pin 5

2、Modbus Poll软件配置:
软件下载地址:http://www.cnblogs.com/worldsing/p/3231855.html

9600 8 N 1 与 Modbus Poll连接地址为1


3、状态:
通信过程中PA7 LED闪烁

4、代码信息:只留RTU模式 优化代码

ModbusUser.c      用记功能代码
ModbusFun.c       整合FreeModbus的功能c代码文件;
ModbusRTU.c       Modbus的RTU模式桢处理,整理FreeModbus去除ASCII模式;
ModbusPort.c      关于硬件的移植包括串口、定时器、桢队列功能实现(目前是单桢处理);
                  (此文件是ATMEGA128硬件的代码,其它CPU需要自己移植)

FreeModBus会功能打开时IAR 5.40环境下 代码尺寸为:
5 287 bytes of CODE memory (+ 12 range fill )
941 bytes of DATA memory (+ 14 absolute )

#define MB_FUNC_HANDLERS_MAX                                  ( 16 )//使用的功能码数量

#define MB_FUNC_OTHER_REP_SLAVEID_BUF                   ( 8 )

#define MB_FUNC_OTHER_REP_SLAVEID_ENABLED         (1 ) //报告从设备功能

#define MB_FUNC_READ_INPUT_ENABLED                     (1 ) //读输入寄存器功能

#define MB_FUNC_READ_HOLDING_ENABLED                   (1 ) //读保持寄存器功能

#define MB_FUNC_WRITE_HOLDING_ENABLED               (1 ) //写操持寄存存功能

#define MB_FUNC_WRITE_MULTIPLE_HOLDING_ENABLED(1 )//写多个操持寄存存功能

#define MB_FUNC_READ_COILS_ENABLED                        (1 )//读线圈

#define MB_FUNC_WRITE_COIL_ENABLED                     (1 )//写线圈

#define MB_FUNC_WRITE_MULTIPLE_COILS_ENABLED      (1 )//写多个线圈

#define MB_FUNC_READ_DISCRETE_INPUTS_ENABLED      (1 )//读离散输入

#define MB_FUNC_READWRITE_HOLDING_ENABLED         (1 )//读写多个寄存器


//2013/08/08
优化port.c和rtu.c

worldsing 发表于 2013-8-8 17:52:39

http://cache.ourdev.cn/new2012/forum/201308/02/184659n8wja8kuenuuwjr6.png.thumb.jpg

不再为你停留 发表于 2013-8-9 15:33:23

{:smile:}{:smile:}{:smile:}{:smile:}{:smile:}

MicroPLC 发表于 2013-8-12 11:26:53

这里面有modbusTCP部分吗?

worldsing 发表于 2013-8-16 17:48:59

MicroPLC 发表于 2013-8-12 11:26 static/image/common/back.gif
这里面有modbusTCP部分吗?

被我删除了

worldsing 发表于 2013-8-16 17:53:51

这回把User.c和function.c合并了,同样的配置,Flash 下降,RAM反了长了点。

4 880 bytes of CODE memory (+             12 range fill )
   977 bytes of DATA memory (+ 14 absolute )

worldsing 发表于 2013-8-16 18:04:50

//2013/08/16
线圈BUG解决(后来发现不一定是BUG)
1、eMBException eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen )中的
    usRegAddress++;行注释掉,否则输出线圈0永远无法输出,其它的线圈错位。

2、eMBException eMBFuncWriteCoil( UCHAR * pucFrame, USHORT * usLen )中的写操作
   while循环改加入 usBitOffset += 8; 否则8以后的线圈无法进行写操作。
while( iNCoils > 0 ){
          xMBUtilSetBits( ucRegCoilsBuf, usBitOffset,
                        ( uint8_t )( iNCoils > 8 ? 8 : iNCoils ),
          *pucRegBuffer++ );
          iNCoils -= 8;
          usBitOffset += 8;
          }         

3、细读后发现,usRegAddress++在每个操作下都有,有可能是原版就是有意这么写的,但这样
有违背MODBU协议,也有就是地址0的所有东西是没法操作到的,修改的版本中已可以操作0址
址。
4、合并User.c和rtu.c



worldsing 发表于 2013-8-16 18:08:04



liangws201 发表于 2013-10-17 20:33:37

支持,顶顶顶顶

worldsing 发表于 2013-10-20 21:17:15

liangws201 发表于 2013-10-17 20:33 static/image/common/back.gif
支持,顶顶顶顶

{:handshake:}

JudeTse 发表于 2013-10-20 22:23:48

有没有用ICC AVR写的FreeMODBUS呢,我想要参考一下!

worldsing 发表于 2013-10-23 09:20:03

JudeTse 发表于 2013-10-20 22:23 static/image/common/back.gif
有没有用ICC AVR写的FreeMODBUS呢,我想要参考一下!

把Port.c改就行了,很简单的{:smile:}

lianfutiana 发表于 2015-8-25 15:22:48

学习中。。。。。。。。。。。。。。。。。。。

andy_huang 发表于 2016-4-2 17:10:21

谢谢分享!

fcmer2016 发表于 2021-5-27 21:23:51

采用状态机要好很多。

laihappy 发表于 2022-8-14 12:33:43

楼主,我有个128A modbus调试,联系我,有偿
页: [1]
查看完整版本: FreeModBus for AVR IAR工程