搜索
bottom↓
回复: 10

请问各位有实现过W5500+STM32的freemodbus案例吗?

[复制链接]

出0入0汤圆

发表于 2017-6-24 14:05:47 | 显示全部楼层 |阅读模式
请问各位有实现过W5500+STM32的freemodbus案例吗?

请问,如果是用TCP的话,是不是 MB仍然要全部包含?而只修改port部分呢?

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

发表于 2017-6-24 16:34:04 | 显示全部楼层
http://blog.csdn.net/jordan20052009/article/details/46967451    可以参考这个。  试过可以用

出0入0汤圆

 楼主| 发表于 2017-6-24 21:15:54 | 显示全部楼层
嗯!

谢谢了!

现在的问题是 已经实现了W5500 对网络的基本读写。也就是一个SPI的基本操作。。。

网络上 太多的资料可取。

我发现 移植的问题在于 一个接口部分,并且 问题也处在这里了……

出0入0汤圆

 楼主| 发表于 2017-6-24 21:16:40 | 显示全部楼层
    while(1)                            /*循环执行的函数*/
    {


        switch(getSn_SR(0))                   //获取socket0的状态
        {
        case SOCK_INIT:                    //socket初始化完成
            listen(0);                       //监等待连接
            break;
        case SOCK_ESTABLISHED:             //socket连接建立
            if(getSn_IR(0) & Sn_IR_CON)
            {
                setSn_IR(0, Sn_IR_CON);        //Sn_IR的第0位置1
            }
            receive_length=getSn_RX_RSR(0);  //获取已接收数据大小

            if(receive_length>0)
            {



                eMBPoll();


            }
            break;
        case SOCK_CLOSE_WAIT:              //socket等待关闭状态
            disconnect(0);
            break;
        case SOCK_CLOSED:                  //socket关闭
            socket(0,Sn_MR_TCP,502,Sn_MR_ND);//打开socket0的一个端口
            break;
        }


    }
}

出0入0汤圆

 楼主| 发表于 2017-6-24 21:17:32 | 显示全部楼层
porttcp.c

这个应该有很大的问题!

@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@
/*
* FreeModbus Libary: lwIP Port
* Copyright (C) 2006 Christian Walter <wolti@sil.at>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA
*
* File: $Id: porttcp.c,v 1.1 2006/08/30 23:18:07 wolti Exp $
*/

/* ----------------------- System includes ----------------------------------*/
#include <stdio.h>
#include <string.h>
#include "port.h"
#include "w5500.h"
#include "socket.h"

/* ----------------------- Modbus includes ----------------------------------*/
#include "mb.h"
#include "mbport.h"

/* ----------------------- MBAP Header --------------------------------------*/
#define MB_TCP_UID          6
#define MB_TCP_LEN          4
#define MB_TCP_FUNC         7

#define MB_TCP_DEFAULT_PORT  502          /* TCP listening port. */
#define MB_TCP_BUF_SIZE     ( 256 + 7 )   /* Must hold a complete Modbus TCP frame. */

/* ----------------------- Prototypes ---------------------------------------*/
static UCHAR    aucTCPBuf[MB_TCP_BUF_SIZE];           //接收缓冲区
static USHORT   usTCPBufLen;


BOOL
xMBTCPPortInit( USHORT usTCPPort )
{
    BOOL bOkay = FALSE;

    USHORT usPort;
    if( usTCPPort == 0 )
    {
        usPort = MB_TCP_DEFAULT_PORT;
    }
    else
    {
        usPort = (USHORT)usTCPPort;
    }

//    // 侦听端口 Modbus-TCP 端口
//                Socket0_Config(usPort);
//    Socket_Listen(0);

    listen(0);

    bOkay = TRUE;
    return bOkay;
}


void
vMBTCPPortClose(  )
{

}

void
vMBTCPPortDisable( void )
{

}

BOOL
xMBTCPPortGetRequest( UCHAR ** ppucMBTCPFrame, USHORT * usTCPLength )
{
    *ppucMBTCPFrame = &aucTCPBuf[0];
    *usTCPLength = usTCPBufLen;
    /* Reset the buffer. */
    usTCPBufLen = 0;
    return TRUE;
}

BOOL
xMBTCPPortSendResponse(const UCHAR * pucMBTCPFrame, USHORT usTCPLength )
{

//        Write_SOCK_Data_Buffer( 0,(UCHAR*)pucMBTCPFrame, usTCPLength);

    send(0,(UCHAR*)pucMBTCPFrame, usTCPLength);
    return TRUE;
       
}



BOOL
xMBPortTCPPool( void )
{
    unsigned short int us_rlen;
    unsigned char i;

//        i=Read_1_Byte(SIR);

    i=getSn_IR(SIR);

//    if(getSn_SR(0)&0x01)
//    if(i&0x01)
//    {

//                i=Read_SOCK_1_Byte(0,Sn_IR);        //读W5500中断
//                Write_SOCK_1_Byte(0,Sn_IR,i);
//                us_rlen        = Read_SOCK_Data_Buffer(0, aucTCPBuf);        //读新数据放到aucTCPBuf中

        if(getSn_IR(0) & Sn_IR_CON)
        {
            setSn_IR(0, Sn_IR_CON);                                                                  /*清除接收中断标志位*/
        }
        us_rlen=getSn_RX_RSR(0);                                                                                    /*定义len为已接收数据的长度*/

        recv(0,aucTCPBuf,us_rlen);                                                                                     /*接收来自Server的数据*/

        if(us_rlen==0)
            return FALSE;
        usTCPBufLen = us_rlen;                                 //读到新数据,得到长度

        ( void )xMBPortEventPost( EV_FRAME_RECEIVED );                        //发送已接收到新数据到Modbus-TCP状态机

        if(i&Sn_IR_DISCON)                /* TCP Disconnect */
        {
            listen(0);                //重新监听SOCK 0
        }
        if(i&Sn_IR_TIMEOUT)                   //超时
        {
            listen(0);                //重新监听SOCK 0
        }

//    }



    return TRUE;
}

void
EnterCriticalSection( void )
{
    __disable_irq();
}

void
ExitCriticalSection( void )
{
    __enable_irq();
}

出0入0汤圆

 楼主| 发表于 2017-6-24 21:18:36 | 显示全部楼层
恳请哪位 老师可以指点一下!

谢谢了!

出0入0汤圆

发表于 2017-6-24 21:41:14 | 显示全部楼层
阿豪博士 发表于 2017-6-24 21:18
恳请哪位 老师可以指点一下!

谢谢了!

印象中在哪看到过,帮你搜索一下,如下
http://blog.csdn.net/tcjy1000/article/details/22962067

PS:友情提示一下,请测试时间长一点比如1个小时,2个小时;帧间隔稍微短一些,比如100MS的帧间隔或50MS,也许可能会发生粘包现象,恭喜你。


出0入0汤圆

发表于 2017-9-11 14:39:02 | 显示全部楼层
也问个问题:如果多台计算机同时访问一个W5500,freemodbus可以各自响应吗?

出0入0汤圆

 楼主| 发表于 2017-9-12 12:17:23 | 显示全部楼层
多主机多主机多主机多主机多主机多主机多主机

出0入0汤圆

 楼主| 发表于 2017-9-12 13:13:40 来自手机 | 显示全部楼层
请问上面,你做出来了?

出5入42汤圆

发表于 2017-9-12 15:05:29 | 显示全部楼层
我实现过两块W5500挂STM32的SPI上的Modbus TCP Slave,基本上官方的资料还是很有价值的,另外强烈推荐使用最新版的socket方式的调用,尽量不要直接操作寄存器。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2024-4-25 12:26

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

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