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

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

[复制链接]
  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:18:51

9

主题

44

回帖

333

积分

中级会员

积分
333
发表于 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个,不知到会不会出问题,@版主,请赐教下,或者有没有更好的办法。

回复

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:8
  • 最近打卡:2025-04-27 10:40:24

11

主题

425

回帖

1971

积分

版主

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

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:18:51

9

主题

44

回帖

333

积分

中级会员

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

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

使用道具 举报 送花

  • 打卡等级:偶尔看看III
  • 打卡总天数:50
  • 最近打卡:2025-04-30 22:59:03

73

主题

5882

回帖

1万

积分

超级版主

积分
12073
发表于 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编程灵活,能处理的任务要复杂得多。
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:偶尔看看I
  • 打卡总天数:16
  • 最近打卡:2025-04-30 08:18:51

9

主题

44

回帖

333

积分

中级会员

积分
333
发表于 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块钱,果断让他们去落灰了
回复 支持 反对

使用道具 举报 送花

  • 打卡等级:初来乍到
  • 打卡总天数:6
  • 最近打卡:2025-04-17 09:50:59

17

主题

91

回帖

755

积分

高级会员

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

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

使用道具 举报 送花

  • 打卡等级:以坛为家II
  • 打卡总天数:518
  • 最近打卡:2025-05-01 05:52:49
已绑定手机

46

主题

1694

回帖

2540

积分

金牌会员

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

软定时器
回复 支持 反对

使用道具 举报 送花

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

本版积分规则

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

GMT+8, 2025-5-2 06:58 , Processed in 0.254570 second(s), 91 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

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