zackwu 发表于 2023-4-21 10:05:49

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

我是一个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。

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

#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 < 1000)
        {
                arr++;
        }
        else
        {
                arr = 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个,不知到会不会出问题,@版主,请赐教下,或者有没有更好的办法。

清风予我 发表于 2023-4-21 10:44:59

本帖最后由 STC爱好者 于 2023-4-21 10:46 编辑


STC32G 【独立例程目录】,请楼主参考


zackwu 发表于 2023-4-21 10:55:34

STC爱好者 发表于 2023-4-21 10:44
STC32G 【独立例程目录】,请楼主参考

定时器就是参考第二个例程,完成的,要扩展出96个咋弄呢?能不能写一个通用的方法,供调用{:lol:}

梁工 发表于 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编程灵活,能处理的任务要复杂得多。

zackwu 发表于 2023-4-21 13:17:22

本帖最后由 zackwu 于 2023-4-21 13:21 编辑

梁工 发表于 2023-4-21 11:26
楼主你这是要模拟PLC吧?网上有直接使用51单片机做PLC的程序,通过转换软件可以将三菱PLC、西门子PLC这类产 ...
意思差不多是这个意思,我知道网上有F103单片机做的硬件支持,软件底层是三菱的。通信起来不是怎么的稳定,又加上那些基本都固化了,私有化硬件更改不是那么的方便,我现在所做这个确实和那个类似,都是采集信号,然后做逻辑控制输出相应信号。
为啥选用单片机,一方面私有化改造比较方便,另一方面,批量化成本低,不再受已经固化好的PLC限制,
能否费神弄这样的函数库,也算是丰富了组件。{:lol:}

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


你说的这两个IO扩展我都买了,看到STC32G才4块钱,果断让他们去落灰了

zhx 发表于 2023-4-28 17:54:30

zackwu 发表于 2023-4-21 10:55
定时器就是参考第二个例程,完成的,要扩展出96个咋弄呢?能不能写一个通用的方法,供调用 ...

一个定时器,给96个变量用
没有规定,一个定时器就减一个变量

jwd 发表于 2023-4-28 21:49:25

zackwu 发表于 2023-4-21 10:55
定时器就是参考第二个例程,完成的,要扩展出96个咋弄呢?能不能写一个通用的方法,供调用 ...

软定时器
页: [1]
查看完整版本: 集思广益,一个PLC从业者用函数库去做个产品