打印

使用W5500开发的MODBUS之2 控制一个数字量

[复制链接]
1157|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
wangjiahao88|  楼主 | 2017-8-7 15:18 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
/*----------------------------------------------------
说明 :此例程为W5500  创建ModBUS_TCP服务器
IP:192.168.0.101
PORT:6000
------------------------------------------------------*/

#include "main.h"

uint8 mac[6]={0x00,0x08,0xdc,0x11,0x11,0x11};/*定义Mac变量*/
uint8 lip[4]={192,168,5,101};/*定义lp变量*/
uint16 MYPORT=6000;
uint8 sub[4]={255,255,255,0};/*定义subnet变量*/
uint8 gw[4]={192,168,5,1};/*定义gateway变量*/
uint8 ip[4];


uint8 buffer[2048];/*定义一个2KB的缓存*/
uint8 modbus_send[2048];/*定义一个2KB的缓存*/

相关帖子

沙发
wangjiahao88|  楼主 | 2017-8-7 15:19 | 只看该作者
int main(void)
{
  uint16 len=0;
        uint8 SocketChanel=0;
        uint16 modbus_len;
       
        RCC_Configuration();
        GPIO_Configuration();
       
        Systick_Init(72);/* 初始化Systick工作时钟*/
        USART1_Init(); /*初始化串口通信:9600@8-n-1*/
        printf("STM32 initialization over.\r\n");
       
        Reset_W5500();/*硬重启W5500*/
  WIZ_SPI_Init();/*初始化SPI接口*/
  printf("W5500 initialized!\r\n");  
       
        setSHAR(mac);/*配置Mac地址*/
  setSUBR(sub);/*配置子网掩码*/
  setGAR(gw);/*配置默认网关*/
  setSIPR(lip);/*配置Ip地址*/
       
        //Init. TX & RX Memory size of w5500
  sysinit(txsize, rxsize); /*初始化8个socket*/
       
        setRTR(2000);/*设置溢出时间值*/
  setRCR(5);/*设置最大重新发送次数*/
       
        getSIPR (ip);
  printf("IP : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
  getSUBR(ip);
  printf("SN : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
  getGAR(ip);
  printf("GW : %d.%d.%d.%d\r\n", ip[0],ip[1],ip[2],ip[3]);
  printf("Network is ready.\r\n");
        setkeepalive(0);

使用特权

评论回复
板凳
wangjiahao88|  楼主 | 2017-8-7 15:19 | 只看该作者
  while (1)                               
  {
       switch(getSn_SR(SocketChanel))/*获取socket0的状态*/
       {
         case SOCK_INIT:/*socket初始化完成*/
           listen(SocketChanel);/*在TCP模式下向服务器发送连接请求*/
   
           break;
         case SOCK_ESTABLISHED:/*socket连接建立*/
                     
           if(getSn_IR(SocketChanel) & Sn_IR_CON)
           {
              setSn_IR(SocketChanel, Sn_IR_CON);/*Sn_IR的第0位置1*/
            }
           len=getSn_RX_RSR(SocketChanel);/*len为已接收数据的大小*/
           if(len>0)
           {

                                memset(buffer,0x00,len+1);

              recv(SocketChanel,buffer,len);/*W5200接收来自Sever的数据*/
               
                                                  modbus_len = tcp_modslv(buffer,modbus_send);
                                                 
                                                  if(modbus_len > 6)
                                                        {
                  send(SocketChanel,modbus_send,modbus_len);/*W5200向Server发送数据*/
                                                        }

            }
                                                send_ka(SocketChanel);          /*防止网线断开*/
                                               
           break;
         case SOCK_CLOSE_WAIT:/*socket等待关闭状态*/
                                         disconnect(SocketChanel);   //防止上位机软件 断开重新连接的时候还能打开SOCKET
           break;
         case SOCK_CLOSED:/*socket关闭*/
           socket(SocketChanel,Sn_MR_TCP,MYPORT,Sn_MR_ND);/*打开socket0的一个端口*/
           break;
      }
                        if((rtubuf1[0] & 0x01) == 0x01)  LED_ON;
                  else                             LED_OFF;
                       
  }
}

使用特权

评论回复
地板
wangjiahao88|  楼主 | 2017-8-7 15:21 | 只看该作者
void RCC_Configuration(void)
{

  RCC_APB1PeriphClockCmd(RCC_APB1Periph_SPI2, ENABLE);

  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA | RCC_APB2Periph_GPIOB |RCC_APB2Periph_GPIOC
                                                                                   | RCC_APB2Periph_AFIO  | RCC_APB2Periph_USART1, ENABLE);
}

使用特权

评论回复
5
wangjiahao88|  楼主 | 2017-8-7 15:23 | 只看该作者
void GPIO_Configuration(void)
{
  GPIO_InitTypeDef GPIO_InitStructure;

  GPIO_InitStructure.GPIO_Pin = LED;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

  GPIO_SetBits(GPIOB, LED); // led off


  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_InitStructure.GPIO_Pin =  USART1_TX;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN_FLOATING;
  GPIO_InitStructure.GPIO_Pin = USART1_RX;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  
  // SPI
  /* Configure SPIy pins: SCK, MISO and MOSI */
  GPIO_InitStructure.GPIO_Pin = WIZ_SCLK | WIZ_MISO | WIZ_MOSI;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AF_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
        GPIO_InitStructure.GPIO_Pin = WIZ_SCS|LED;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  GPIO_SetBits(GPIOB, WIZ_SCS);
       

  GPIO_InitStructure.GPIO_Pin = WIZ_RESET ;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOA, &GPIO_InitStructure);
  GPIO_SetBits(GPIOA, WIZ_RESET);

  
  GPIO_InitStructure.GPIO_Pin = WIZ_INT;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
  GPIO_Init(GPIOB, &GPIO_InitStructure);
  
}

使用特权

评论回复
6
wangjiahao88|  楼主 | 2017-8-7 15:23 | 只看该作者
使用过程信号发生器仪表标定4-20mA的输入

1.jpg (246.71 KB )

1.jpg

使用特权

评论回复
7
wangjiahao88|  楼主 | 2017-8-7 15:25 | 只看该作者

使用过程信号发生器仪表标定4-20mA的输入

2.jpg (200.06 KB )

2.jpg

使用特权

评论回复
8
wangjiahao88|  楼主 | 2017-8-7 15:26 | 只看该作者
使用过程信号发生器仪表标定4-20mA的输入

3.jpg (505.33 KB )

3.jpg

使用特权

评论回复
9
wangjiahao88|  楼主 | 2017-8-7 15:32 | 只看该作者
程序源代码上来喽!

欢迎大家一起探讨!

Ethw5500_MODBUSTCP_LED.zip

3.15 MB

使用特权

评论回复
10
xujunyi3611| | 2017-8-16 20:09 | 只看该作者
最后一张图的那个小仪器是什么东西呢?

使用特权

评论回复
11
Puremr| | 2017-8-26 10:19 | 只看该作者
好像用的是STM32这个作为主控的。

使用特权

评论回复
12
Bruing| | 2017-8-26 10:56 | 只看该作者
wangjiahao88 发表于 2017-8-7 15:26
使用过程信号发生器仪表标定4-20mA的输入

这个过程信号发生器,输出的电流准确吗?

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

473

主题

7517

帖子

30

粉丝