找回密码
 立即注册
查看: 1220|回复: 6

集思广益,一个PLC从业者用函数库去做个产品

[复制链接]

该用户从未签到

7

主题

35

回帖

211

积分

中级会员

积分
211
发表于 2023-4-21 10:05:49 | 显示全部楼层 |阅读模式
我是一个PLC从业者,有个需求,让我有了去做一块单片机板子去实现的想法,功能大约如下:
1:IO信号的处理,输入输出信号,我的想法是在RAM里面创建对应的变量,指定对应的输入输出点,比如我这个需求最大的点数96个输入,72个输出,(一个芯片没这么多点,通过通信做主从站)
     每一个输入点有一个延时时间可设定,时间可设定,笼统的意思是,变量Input,变量TimeSet,变量Output,那么我我再用硬件去指定,比如我定义P2^0为X0,P2^1为Y0,得到的效果是按下X0,延时TimeSet设定的值,输出Y0,

2:通过模拟IIC去和TM1650去通信,显示和设定数值,
3:MODBUS通信,主站从站,主站从站直接读取写入中间变量,

现官网找到,库函数,延时,中断1MS,那么如何去扩展出96个延时呢?
我用的硬件是STC32G。

发帖的目的是想官方能不能也开发出相应的函数来,能让我们这些人也享受到国产单片机给我门带来的福利
比如说,
1,定时器,
2,模拟通信,TM1650,
3,MOSBUS通信,点位直接用中间替代。
。。。。。。。。
这样想我们这些只懂的工艺的人努力一下也能使用上单片机,当然都是简单的,复杂的还得专业的来。
我现在所做的,如下:

#include "STC32G_Timer.h"
#include "STC32G_GPIO.h"
#include "STC32G_NVIC.h"
#include "Global.h"
/************************ IO口配置 ****************************/
void GPIO_config(void)
{
        P6_MODE_IO_PU(GPIO_Pin_All);
        P4_MODE_IO_PU(GPIO_Pin_0);
}

void Timer_config(void)
{

        TIM_InitTypeDef                TIM_InitStructure;                                                //结构定义
        //定时器4
        TIM_InitStructure.TIM_ClkSource = TIM_CLOCK_12T;        //指定时钟源,     TIM_CLOCK_1T,TIM_CLOCK_12T,TIM_CLOCK_Ext
        TIM_InitStructure.TIM_ClkOut    = DISABLE;                                        //是否输出高速脉冲, ENABLE或DISABLE
        TIM_InitStructure.TIM_Value     = (u16)(65536UL - (MAIN_Fosc / (1000*12)));                //初值
        TIM_InitStructure.TIM_Run       = ENABLE;                                        //是否初始化后启动定时器, ENABLE或DISABLE
        Timer_Inilize(Timer4,&TIM_InitStructure);                                        //初始化Timer4          Timer0,Timer1,Timer2,Timer3,Timer4
        NVIC_Timer4_Init(ENABLE,NULL);                //中断使能, ENABLE/DISABLE; 无优先级
}

void main(void)
{
        WTST = 0;
        EAXSFR();
        CKCON = 0;
       
        GPIO_config();
        Timer_config();
        EA = 1;
        P40 = 0;
       
        while (1)
        {
                if (t_out_1000)
                {
                        P65 = ~P65;
                       t_out_1000 = 0;

                }
        }
}



//========================================================================
// 函数: Timer4_ISR_Handler
// 描述: Timer4中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer4_ISR_Handler (void) interrupt TMR4_VECTOR                //进中断时已经清除标志
{
        if (arr[0] < 1000)
        {
                arr[0]++;
        }
        else
        {
                arr[0] = 0;
                t_out_1000 = 1;
        }
}


在单独.H文件里面写上extern bit t_out_1000;
在对应.C文件里面写上bit t_out_1000;

对于写多个延时,我的想法是,在全局变量建立输入中间变量数组,时间设定数组,输出数组,
然后再中断里面写,当输入有信号,时间就开始++,判断时间有没有达到,达到就输出,


//========================================================================
// 函数: Timer4_ISR_Handler
// 描述: Timer4中断函数.
// 参数: none.
// 返回: none.
// 版本: V1.0, 2020-09-23
//========================================================================
void Timer4_ISR_Handler (void) interrupt TMR4_VECTOR                //进中断时已经清除标志
{


   if (Input0)
        {
                TimeCount++;
                if (TimeCount >= TimeSet)
                {
                        TimeCount = 0;
                        Output0 = 1;
                }
        }
        else
        {
                TimeCount = 0;
                Output0 = 0;
        }

}
如此复制96个,不知到会不会出问题,@版主,请赐教下,或者有没有更好的办法。

回复 送花

使用道具 举报

  • TA的每日心情
    奋斗
    2023-12-13 11:59
  • 签到天数: 1 天

    [LV.1]初来乍到

    3

    主题

    338

    回帖

    1659

    积分

    版主

    积分
    1659
    发表于 2023-4-21 10:44:59 | 显示全部楼层
    本帖最后由 STC爱好者 于 2023-4-21 10:46 编辑

    1.png
    STC32G 【独立例程目录】,请楼主参考
    STC32G-SOFTWARE-LIB-20230417.zip (15.34 MB, 下载次数: 43)

    QQ:2269694595     微信:18106296594
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    7

    主题

    35

    回帖

    211

    积分

    中级会员

    积分
    211
     楼主| 发表于 2023-4-21 10:55:34 | 显示全部楼层
    STC爱好者 发表于 2023-4-21 10:44
    STC32G 【独立例程目录】,请楼主参考

    定时器就是参考第二个例程,完成的,要扩展出96个咋弄呢?能不能写一个通用的方法,供调用
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    46

    主题

    3029

    回帖

    6827

    积分

    超级版主

    积分
    6827
    发表于 2023-4-21 11:26:54 | 显示全部楼层
    楼主你这是要模拟PLC吧?网上有直接使用51单片机做PLC的程序,通过转换软件可以将三菱PLC、西门子PLC这类产品的代码转到51单片机,不过我没用过。

    类似产品则做过不少,比如64点输入,64点输出,10ms扫描间隔(即10ms先读入所有输入点,处理程序,然后输出结果),类似PLC的方式处理。
    点数多,我用天仙配的74HC165(输入)+74HC595(输出),各8片,就是输入64点,输出64点。
    定时器产生10ms信标(现在的MCU速度,计算量不大可以到1ms)。
    任务开始,读入64点输入状态。
    根据输入状态和处理任务,处理好之后,刷新输出64点。

    这种程序,用于过程处理比较方便。但是后来由于MCU功能原来越复杂,速度越来越快,处理的任务越来越多,所以这种简单执行的方式,只是程序中的一个流程而已,而可以有多个任务,多个流程,更别说有RTOS了。MCU编程远比PLC编程灵活,能处理的任务要复杂得多。
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    7

    主题

    35

    回帖

    211

    积分

    中级会员

    积分
    211
     楼主| 发表于 2023-4-21 13:17:22 | 显示全部楼层
    本帖最后由 zackwu 于 2023-4-21 13:21 编辑
    梁工 发表于 2023-4-21 11:26
    楼主你这是要模拟PLC吧?网上有直接使用51单片机做PLC的程序,通过转换软件可以将三菱PLC、西门子PLC这类产 ...

    意思差不多是这个意思,我知道网上有F103单片机做的硬件支持,软件底层是三菱的。通信起来不是怎么的稳定,又加上那些基本都固化了,私有化硬件更改不是那么的方便,我现在所做这个确实和那个类似,都是采集信号,然后做逻辑控制输出相应信号。
    为啥选用单片机,一方面私有化改造比较方便,另一方面,批量化成本低,不再受已经固化好的PLC限制,
    能否费神弄这样的函数库,也算是丰富了组件。

    我不是很明白这个单片机编程,思想是怎么回事,模块化编程,和面向对象的思想能否在这个上面实现,性能绝对是没问题的。


    你说的这两个IO扩展我都买了,看到STC32G才4块钱,果断让他们去落灰了
    回复 支持 反对 送花

    使用道具 举报

    该用户从未签到

    10

    主题

    40

    回帖

    394

    积分

    中级会员

    积分
    394
    发表于 2023-4-28 17:54:30 | 显示全部楼层
    zackwu 发表于 2023-4-21 10:55
    定时器就是参考第二个例程,完成的,要扩展出96个咋弄呢?能不能写一个通用的方法,供调用 ...

    一个定时器,给96个变量用
    没有规定,一个定时器就减一个变量
    回复 支持 反对 送花

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 07:44
  • 签到天数: 170 天

    [LV.7]常住居民III

    26

    主题

    815

    回帖

    2044

    积分

    金牌会员

    积分
    2044
    发表于 2023-4-28 21:49:25 | 显示全部楼层
    zackwu 发表于 2023-4-21 10:55
    定时器就是参考第二个例程,完成的,要扩展出96个咋弄呢?能不能写一个通用的方法,供调用 ...

    软定时器
    回复 支持 反对 送花

    使用道具 举报

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

    本版积分规则

    QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

    GMT+8, 2024-5-17 03:17 , Processed in 0.075549 second(s), 55 queries .

    Powered by Discuz! X3.5

    © 2001-2024 Discuz! Team.

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