0 前言
    本文使用freemodbus协议栈,在EasyARM i.mx287上实现了modbus tcp从机。

在该从机中定义了线圈寄存器。当中线圈寄存器地址较低的4位和EasyARM的P2.4至P2.5关联,通过modbus指令可控制GPIO的输出。本文改动自freemodbus 演示样例LINUXTCP。经过简单的改动也可用于其它Linux开发板。

    【相关博文】
    【代码仓库】
    代码仓库位于bitbucket——easyarm-modbus-tcp,请使用Hg克隆或者直接下载zip包。

请不要使用不论什么版本号的IE浏览器訪问链接,除非你已经知道所使用的IE浏览器符合HTML5标准。推荐使用谷歌或者火狐浏览器訪问,若使用国产双核浏览器请切换到极速模式。

 1 部分代码
    【gpio-sysfs】
    在gpio-sysfs中添加使能GPIO、禁止GPIO和GPIO定期处理函数。

当中gpio_poll传入的參数为modbus线圈寄存器

int gpio_enable(void)
{
gpio_export(P24);gpio_direction(P24,OUT);gpio_write(P24,0);
gpio_export(P25);gpio_direction(P25,OUT);gpio_write(P25,0);
gpio_export(P26);gpio_direction(P26,OUT);gpio_write(P26,0);
gpio_export(P27);gpio_direction(P27,OUT);gpio_write(P27,0);
return 0;
} int gpio_disable(void)
{
gpio_write(P24,0);gpio_unexport(P24);
gpio_write(P25,0);gpio_unexport(P25);
gpio_write(P26,0);gpio_unexport(P26);
gpio_write(P27,0);gpio_unexport(P27);
return 0;
}
int gpio_poll(unsigned char status)
{
status & 0x01 ? gpio_write(P24,1) : gpio_write(P24,0);
status & 0x02 ? gpio_write(P25,1) : gpio_write(P25,0);
status & 0x04 ? gpio_write(P26,1) : gpio_write(P26,0);
status & 0x08 ? gpio_write(P27,1) : gpio_write(P27,0);
return 0;
}
    【modbus poll】
    pvPollingThread线程中获得线圈寄存器结果——ucRegCoilsBuf[0],并传递至gpio_poll函数中。
void* pvPollingThread( void *pvParameter )
{
eSetPollingThreadState( RUNNING );
if( eMBEnable( ) == MB_ENOERR )
{
do
{
gpio_poll(ucRegCoilsBuf[0]); // 改变IO口状态
if( eMBPoll( ) != MB_ENOERR )
break;
}
while( eGetPollingThreadState( ) != SHUTDOWN );
}
( void )eMBDisable( );
eSetPollingThreadState( STOPPED );
return 0;
}
    【线圈寄存器读写函数】
eMBErrorCode
eMBRegCoilsCB( UCHAR * pucRegBuffer, USHORT usAddress, USHORT usNCoils, eMBRegisterMode eMode )
{
eMBErrorCode eStatus = MB_ENOERR;
int iNCoils = ( int )usNCoils;
int usBitOffset; if( ( usAddress >= REG_COILS_START ) &&
( usAddress + usNCoils <= REG_COILS_START + REG_COILS_SIZE ) )
{ usBitOffset = ( int )( usAddress - REG_COILS_START );
switch ( eMode )
{
case MB_REG_READ:
while( iNCoils > 0 )
{
*pucRegBuffer++ = xMBUtilGetBits( ucRegCoilsBuf, usBitOffset,
( UCHAR )( iNCoils > 8 ? 8 : iNCoils ) );
iNCoils -= 8;
usBitOffset += 8;
}
break; case MB_REG_WRITE:
while( iNCoils > 0 )
{
xMBUtilSetBits( ucRegCoilsBuf, usBitOffset,
( UCHAR )( iNCoils > 8 ? 8 : iNCoils ),
*pucRegBuffer++ );
iNCoils -= 8;
usBitOffset += 8;
}
break;
}
}
else
{
eStatus = MB_ENOREG;
}
return eStatus;
}
    【makefile】
# 指定编译器
CROSS = arm-fsl-linux-gnueabi-
CC = $(CROSS)gcc
STRIP = $(CROSS)strip # CFLAG包含头文件文件夹
CFLAGS = -g -Wall # 头文件查找路径
INC = -I. -Iport -I../../modbus/rtu \
-I../../modbus/ascii -I../../modbus/include -I../../modbus/tcp #
LIBS = -lpthread
# 目标
TARGET = modbustcp
# 源文件
SRC = demo.c gpio-sysfs.c port/portother.c \
port/portevent.c port/porttcp.c \
../../modbus/mb.c ../../modbus/tcp/mbtcp.c \
../../modbus/functions/mbfunccoils.c \
../../modbus/functions/mbfuncdiag.c \
../../modbus/functions/mbfuncholding.c \
../../modbus/functions/mbfuncinput.c \
../../modbus/functions/mbfuncother.c \
../../modbus/functions/mbfuncdisc.c \
../../modbus/functions/mbutils.c # 源文件编译为目标文件
OBJS = $(SRC:.c=.o) .PHONY: clean # 链接为可运行文件
$(TARGET): $(OBJS)
$(CC) $^ -o $@ $(LIBS)
$(STRIP) $@ # 可运行文件和目标文件
clean:
rm -f $(OBJS)
rm -f $(TARGET) # 连续动作,先清除再编译链接,拷贝到tftpboot中
install:clean $(TARGET)
@echo 拷贝到tftpboot文件夹
cp $(TARGET) ~/tftpboot
@echo 复制结束 # 编译规则 添加头文件 $@代表目标文件 $< 代表第一个依赖文件
%.o:%.c
$(CC) $(CFLAGS) $(INC) -o $@ -c $<
2 实验
    【1】在虚拟机中make获得可运行文件——modbustcp
    【2】配置EasyARM IP地址,比如EasyARM的IP地址为192.168.1.211
    ifconfig eht0 192.168.1.211
    【2】通过tftp传输可运行文件至开发板(如果此时虚拟机的IP地址为192.168.1.106)
    tftp -g -r modbustcp 192.168.1.106
    【3】改动可运行权限。

并运行

    chmod a+x modbustcp
    ./modbustcp
    【4】modbus tcp中有一个简单的控制台。输入h可获得指令帮助。当中e为使能协议栈。q为退出程序。

    输入e使能modbus从机协议栈。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrYWk4NzExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

图1 运行modbus tcp
    【5】在windows中打开modbus调试软件,连接EasyARM。IP地址为192.168.1.211,端口号为默认端口号205。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveHVrYWk4NzExMDU=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="" />

图2 通过modbus tcp控制GPIO
图3 实验效果
4 总结
【1】操作步骤较多,实现modbus tcp须要不少的基础知识。

EasyARM i.mx287学习笔记——通过modbus tcp控制GPIO的更多相关文章

  1. EasyARM i.mx287学习笔记——minicom配置和使用

    0 前言     在windows中有非常多串口调试软件,比如putty. 而ubuntu中也有非常多串口调试软件,当中最简单有用的便是minicom了.     本文说明虚拟机中怎样使用minico ...

  2. EasyARM i.mx28学习笔记——开箱试用总结

    0 前言     本月初(2014年8月)购买了周立功的EasyARM开发板,主控为EasyARM i.mx287.出于下面几个理由购买了该开发板.     [1]主要原因,有人约我一起学习一起使用该 ...

  3. 树莓派学习笔记——使用文件IO操作GPIO SysFs方式

    0 前言     本文描写叙述假设通过文件IO sysfs方式控制树莓派 GPIO端口.通过sysfs方式控制GPIO,先訪问/sys/class/gpio文件夹,向export文件写入GPIO编号, ...

  4. .NET MVC 学习笔记(七)— 控制input控件

    .NET MVC 学习笔记(七)— 控制input控件 画面中有时候需要输入数字,这时就需要控制input的输入.以下为保留两位有效数字. /* * 初始化数字输入 */ function initD ...

  5. Beego 学习笔记14:Session控制

    Session控制 1>     Session常用来作为全局变量使用,比如记录当前登录的用户,或者页面之间传递数据使用. 2>     Beego框架内置了 session 模块,目前 ...

  6. 【疯狂Java讲义学习笔记】【流程控制与数组】

    [学习笔记]1.switch语句后的expression表达式的数据类型只能是byte.short.char.int四个整数类型.String(Java 7后才支持)和枚举类型. 2.数组的长度不可变 ...

  7. V-rep学习笔记:关节力矩控制

    Torque or force mode When the joint motor is enabled and the control loop is disabled, then the join ...

  8. Node学习笔记:建立TCP服务器和客户端之间的通信

    结构: socket是应用层和传输层的桥梁.(传输层之上的协议所涉及的数据都是在本机处理的,并没进入网络中) 涉及数据: socket所涉及的数据是报文,是明文. 作用: 建立长久链接,供网络上的两个 ...

  9. Python Web学习笔记之图解TCP/IP协议和浅析算法

    本文通过两个图来梳理TCP-IP协议相关知识.TCP通信过程包括三个步骤:建立TCP连接通道,传输数据,断开TCP连接通道.如图1所示,给出了TCP通信过程的示意图. 图1主要包括三部分:建立连接.传 ...

随机推荐

  1. PHPMailer 发送邮件(二)

    发现PHPMailer又做了较大的更新,以前发送邮件的方法已不太适用,刚好要做一个实验,需要搭建个环境,这里使用Gmail进行测试,现记录下来. 传送地址Github: PHPMailer 基本要求的 ...

  2. PHP小技巧

    1.js获取服务器年月日 var date= '<?php echo date("Y-m-d",time())?>';//获取服务器年月

  3. Oracle Database 12c Release 2安装详解

    第1章 Oracle Database 12c Release 2安装详解 1.1 下载方法 oracle官网https://www.oracle.com 1)打开官方网站,找到下载连接 2)选择更多 ...

  4. 如何优雅的设计React组件

    如何优雅的设计 React 组件 如今的 web 前端已被 React.Vue 和 Angular 三分天下,一统江山十几年的 jQuery 显然已经很难满足现在的开发模式.那么,为什么大家会觉得 j ...

  5. [转载] 使用 Twitter Storm 处理实时的大数据

    转载自http://www.ibm.com/developerworks/cn/opensource/os-twitterstorm/ 流式处理大数据简介 Storm 是一个开源的.大数据处理系统,与 ...

  6. linux操作系统基础篇(七)

    Linux服务篇(二) 1.nfs服务的搭建 安装: yum install rpcbind nfs-utils -y 配置: NFS服务的配置文件为 /etc/exports,这个文件是NFS的主要 ...

  7. C#版本websocket及时通信协议实现

    1:Websocket有java.nodejs.python.PHP.等版本 ,我现在使用的是C3版本,服务器端是Fleck.客户端和服务器端来使用websocket的,下面开始讲解如何使用: 2:在 ...

  8. 《java.util.concurrent 包源码阅读》16 一种特别的BlockingQueue:SynchronousQueue

    SynchronousQueue是一种很特别的BlockingQueue,任何一个添加元素的操作都必须等到另外一个线程拿走元素才会结束.也就是SynchronousQueue本身不会存储任何元素,相当 ...

  9. 史上最全常用正则表达式(Javascript公众号推文)

    2017-04-13 zxin JavaScript很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求.所以我最近把开发中常用的一些正则表达式整理了一下 ...

  10. Java基础概念1

    一.Java数据类型 1.byte 字节型 1byte = 8bit 表示数范围:-2^7~2^7-1(-128~127): 2.short 短整型 2 byte = 16bit 表示数范围:-2^1 ...