请选择 进入手机版 | 继续访问电脑版

迪文科技论坛

 找回密码
 立即注册
搜索
查看: 1886|回复: 8

【开源】分选机的PLC单片机控制

[复制链接]

12

主题

159

回帖

952

积分

高级会员

Rank: 4

积分
952
QQ
发表于 2020-9-14 19:55:33 | 显示全部楼层 |阅读模式
本帖最后由 lihui163 于 2020-9-29 18:23 编辑

      基于分选机的PLC控制,传统做法就是用PLC来控制,比如三菱的,使用梯形图来做程序设计,组态软件来做界面和控制菜单等功能,PC机和PLC通讯采用网络协议   

     而这次我们采用普通的的单片机和咱们的DGUS屏来实现这个功能,程序设计采用C语言,界面控制采用DGUS软件,和PC机的通讯采用以太网控制器芯片  W5500,用单片机来做驱动,总体来说,对于我们三年前的触摸屏开发者来说,DGUS屏的使用率还是非常高的,至少我周围的同事和朋友都还在用这种屏,说着都暴露了年龄。言归正传,这次给大家分享的是一个分选机的PLC控制,首先我们了解一下分选机的定义,分选机是一种利用空气悬浮原理将混合粉状物料分离为轻、重两部分的分选设备。具体应用非常广泛。         
   主要功能:我们主要应用与大理石加工的分选机,振动给料机,来分选大理石颗粒的。
   
   具体电路设计参数

   24V电源输入
   单片机  stm32F103RBT6
   以太网控制器芯片  W5500
   232通讯
   24C02存储
   倾角传感器模块
   这是原理图


  
   







本帖子中包含更多资源

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

x
回复

使用道具 举报

12

主题

159

回帖

952

积分

高级会员

Rank: 4

积分
952
QQ
 楼主| 发表于 2020-9-19 12:43:14 | 显示全部楼层

这是程序这块

本帖子中包含更多资源

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

x
回复

使用道具 举报

12

主题

159

回帖

952

积分

高级会员

Rank: 4

积分
952
QQ
 楼主| 发表于 2020-9-26 22:31:28 | 显示全部楼层
本帖最后由 lihui163 于 2020-9-26 23:01 编辑

今天有空把程序这块简单介绍一下

这是上电初始化的,每次要把存储的配方数据上传给DGUS屏,并在相应的地址写数据,


本帖子中包含更多资源

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

x
回复

使用道具 举报

12

主题

159

回帖

952

积分

高级会员

Rank: 4

积分
952
QQ
 楼主| 发表于 2020-9-29 19:03:11 | 显示全部楼层
本帖最后由 lihui163 于 2020-9-29 19:14 编辑

我们看看如何用单片机来驱动W5500,可以参考这方面的驱动库,也就是SPI驱动看看如何配置

1.首先重置W5500,就是复位W5500

低电平有效,低电平至少保持500us以上。
2.注册临界区函数、片选函数、读写函数

SPI肯定要初始化了,初始化socket,设置为TCP模式
4.Ethernet的通讯配置初始化

通讯配置初始化主要按照顺序依次执行以下3个函数。
1. 注册TCP通讯相关的回调函数 RegisterFunction();
2. 初始化芯片参数 ChipParametersConfiguration();
3. 初始化网络通讯参数 NetworkParameterConfiguration();

这样就移植完成了,可以采用串口助手,输入ping,测试一下,没问题的



这是驱动源码









本帖子中包含更多资源

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

x
回复

使用道具 举报

12

主题

159

回帖

952

积分

高级会员

Rank: 4

积分
952
QQ
 楼主| 发表于 2020-9-30 18:27:45 | 显示全部楼层
本帖最后由 lihui163 于 2020-9-30 18:30 编辑

最后再分享一下软件定时器
 定时器分为硬件定时器和软件定时器,几乎所有的微控制器上都配备了数量有限的硬件定时器,即控制器本身有专门实现定时的模块。几乎所有的硬件定时器的工作原理都是一样的:定时器在外部时钟提供的周期脉冲下进行计数工作,当计数到用户指定的次数时,就产生一次中断。这个过程完全由微控制器内部的定时器硬件电路实现,不需要 CPU 干预。
  相比之下,软件定时器则需要 CPU 的介入来实现了。实现软件定时器一般有两种方法:一种是纯粹依赖 CPU 指令的堆积来实现;另一种是以硬件定时器产生的时间片为基准单位,CPU 基于这个基准单位进行累积来实现。
  显然,硬件定时器的精度取决于驱动的时钟脉冲,一般情况下可以达到很高的精度(纳秒级),而软件定时器的实现由于引入了非硬件因素,精度必然有所下降。
  
  在嵌入式应用中,经常使用定时器进行定时,当定时时间到达之后执行预定的操作。一个具体的嵌入式系统可能有几个甚至数十个定时应用,而这些应用对定时器的精度、最大周期等要求往往都是不同的。比如使用定时器产生一个准确频率的方波是对定时精度比较高的应用,而使用定时器定时翻转一个用户指示灯以表示当前设备的工作状态,则对定时器精度的要求大为下降,这时如果启用硬件定时器无疑是一种资源的浪费。所以,在一个具体的嵌入式系统中,硬件定时器和软件定时器配合使用,是提高性能和降低成本的有效方法。
  那么,在 STM32 中如何利用一个硬件定时器构建多个软件定时器呢?
  我们来分析软件定时器的基本需求:在嵌入式应用中,对定时器的使用模式一般是“定时时间到达后执行预定的操作”。所以需要解决如下一些问题:
  1、 定时多久?——定时时间必须是可配置修改的;
  2、 定时时间到达后做什么?——需要指定执行函数;
  3、 定时器如何工作?——可以选择单次执行或循环执行。

我们看看程序中怎么实现
采用滴答定时器1ms中断作为心跳或者时基

一、初始化软件定时器

/* 软件定时器初始化,清零定时器队列(8个结构体数组对应8个定时器) */
#ifdef ZL_USING_SOFT_TIMER
        bsp_soft_timer_init();
#endif

下面是软件定时器的成员
typedef struct
{
    uint32_t wTimer;                            /* 定时时间计数器 */
    uint16_t hwCtrl;                             /* 定时器开关控制 */
    uint32_t wRunCnt;                          /* 运行计数器 */
    zlfn_st_t fn_call_back;                     /* 回调函数 */
} zl_SoftTimer_t, *ptSoftTimer;

/*   Z L _ S O F T _ T I M E R _ I N I T   */
/*-------------------------------------------------------------------------
    * 功能:初始化软件定时器模块。
    * 参数:无
    * 返回:无
    * 备注:OK.
-------------------------------------------------------------------------*/
void bsp_soft_timer_init(void)
{
    s_wSoftTimerInitOK = 0;

    zl_memory_clear((uint8_t*)s_tSoftTimer, sizeof(s_tSoftTimer)); //s_tSoftTimer为软件定时器队列并清0操作
    s_wSoftTimerInitOK = 1;
}
二、如何启动软件定时器
static void _mcu_run_led_init (void)
{
        st_gpio_out_pp_init(_MCU_RUNLED_PORT, _MCU_RUNLED_PIN);
        
        /* 启动定时器编号5任务函数*/
        zl_soft_timer_set(SFTIMER_ID_runled, 1 * 1000, &_mcu_run_led_cb);
}
形参有定时器编号,定时时间,回调函数(就是执行的任务函数)






回复

使用道具 举报

12

主题

159

回帖

952

积分

高级会员

Rank: 4

积分
952
QQ
 楼主| 发表于 2020-9-30 18:39:03 | 显示全部楼层
三、滴答定时器中断 对每个定时器时间减一操作/*-------------------------------------------------------------------------
    *功能:APP 时标心跳服务,由心跳中断调用。
    *参数:无
    *返回:无
    *备注:ok.
-------------------------------------------------------------------------*/
void app_tick(void)
{
   /*每隔1ms进来一次(仅用于滴答延时)*/
        st_systick_delay_tick();       

   /*软件定时器任务对每个定时器的定时时间减1操作*/
#ifdef ZL_USING_SOFT_TIMER
        zl_soft_timer_tick();
#endif

  /*一个延时模块的驱动任务*/
#ifdef ZL_USING_POLL_DELAY
        zl_poll_delay_tick();
#endif


        /* 调用所有用户相关的时标 */
  app_user_tick();
}
    * 功能:软件定时器任务,在心跳中断里运行。
    * 参数:无
    * 返回:无
    * 备注:OK.

    该函数的运行周期决定定时器的时基。
-------------------------------------------------------------------------*/
void zl_soft_timer_tick(void)
{
    uint16_t i;


    if (!s_wSoftTimerInitOK)
    {
        return;
    }

    for (i = 0; i < ZL_SOFT_TIMER_MAX_NUM; i++)
    {
        if (s_tSoftTimer.hwCtrl)/*判断定时开关*/
        {
            if (0 == s_tSoftTimer.wTimer)/*判断定时时间到没*/
            {
                s_tSoftTimer.hwCtrl = STIMER_STOP;           /* 定时时间到就停掉定时器 */
                s_tSoftTimer.wRunCnt++;                     /* 更新运行计数器,定时时间到以后加1操作 */
            }
            else
            {
                s_tSoftTimer.wTimer--;
            }
        }
    }
}

四、超级循环执行多个定时器任务函数

/*-------------------------------------------------------------------------
    * 功能:软件定时器服务,在超级循环里运行。
    * 参数:无
    * 返回:无
    * 备注:OK.
-------------------------------------------------------------------------*/
void zl_soft_timer_service(void)
{
    uint16_t i;


    if (!s_wSoftTimerInitOK)
    {
        return;
    }
     /*对软件定时器个数加1操作*/
    for (i = 0; i < ZL_SOFT_TIMER_MAX_NUM; i++)
    {
        if (s_tSoftTimer.wRunCnt)
        {
            s_tSoftTimer.fn_call_back();                 /* 执行回调函数 */
            s_tSoftTimer.wRunCnt--;                      /* 对每个定时器中的运行计数器减1操作*/
        }
    }
}


回复

使用道具 举报

12

主题

159

回帖

952

积分

高级会员

Rank: 4

积分
952
QQ
 楼主| 发表于 2020-9-30 18:40:07 | 显示全部楼层
分享完毕,明天就中秋节了,提前祝大家中秋团圆,吃好,玩好
回复

使用道具 举报

0

主题

1

回帖

49

积分

新手上路

Rank: 1

积分
49
发表于 2020-11-11 19:56:30 | 显示全部楼层
老师对嵌入式系统这块很熟啊!可惜介绍的不太清楚。
回复

使用道具 举报

12

主题

159

回帖

952

积分

高级会员

Rank: 4

积分
952
QQ
 楼主| 发表于 2020-11-13 13:26:55 | 显示全部楼层
dwindlebrf 发表于 2020-11-11 19:56
老师对嵌入式系统这块很熟啊!可惜介绍的不太清楚。

有啥问题都可以沟通
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|迪文科技论坛 ( 京ICP备05033781号-1 )

GMT+8, 2024-4-18 19:30 , Processed in 0.096910 second(s), 23 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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