集思广益,一个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个,不知到会不会出问题,@版主,请赐教下,或者有没有更好的办法。
本帖最后由 STC爱好者 于 2023-4-21 10:46 编辑
STC32G 【独立例程目录】,请楼主参考
STC爱好者 发表于 2023-4-21 10:44
STC32G 【独立例程目录】,请楼主参考
定时器就是参考第二个例程,完成的,要扩展出96个咋弄呢?能不能写一个通用的方法,供调用{:lol:} 楼主你这是要模拟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:21 编辑
梁工 发表于 2023-4-21 11:26
楼主你这是要模拟PLC吧?网上有直接使用51单片机做PLC的程序,通过转换软件可以将三菱PLC、西门子PLC这类产 ...
意思差不多是这个意思,我知道网上有F103单片机做的硬件支持,软件底层是三菱的。通信起来不是怎么的稳定,又加上那些基本都固化了,私有化硬件更改不是那么的方便,我现在所做这个确实和那个类似,都是采集信号,然后做逻辑控制输出相应信号。
为啥选用单片机,一方面私有化改造比较方便,另一方面,批量化成本低,不再受已经固化好的PLC限制,
能否费神弄这样的函数库,也算是丰富了组件。{:lol:}
我不是很明白这个单片机编程,思想是怎么回事,模块化编程,和面向对象的思想能否在这个上面实现,性能绝对是没问题的。
你说的这两个IO扩展我都买了,看到STC32G才4块钱,果断让他们去落灰了
zackwu 发表于 2023-4-21 10:55
定时器就是参考第二个例程,完成的,要扩展出96个咋弄呢?能不能写一个通用的方法,供调用 ...
一个定时器,给96个变量用
没有规定,一个定时器就减一个变量
zackwu 发表于 2023-4-21 10:55
定时器就是参考第二个例程,完成的,要扩展出96个咋弄呢?能不能写一个通用的方法,供调用 ...
软定时器
页:
[1]