专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
有没有大神在单片机中写过类似PLC定时器的函数
2019-07-15 16:47
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
1802
8
1756
一般
单片机
中定时器资源有限,而PLC中却有几千个定时器,据说里面的定时器也是由一个基础的衍生出来的,有没有烧友研究过在单片机中一次搞出几十个定时器,同时类似PLC中条件成立定时,条件不成立复位,并且有输出的函数?坐等大神。。。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
8条回答
andy_wsj
2019-07-15 19:25
lydy123 发表于 2015-6-24 21:29
希望可以详细了解下PLC中制作定时器的源代码,请问大神在哪家公司高就?
我们公司 是深圳合信,PLC品牌叫科创思,在国产PLC里面比较好,仿西门子,去年还被西门子告侵权,不过官司我们赢了,我们的模块与西门子的可以互换,西门子的程序直接可以在我们的PLC内运行
高性能的中大型PLC不再仿西门子,使用TI的AM335x,有两款配置,一款720M主频,一款1G主频,接口使用最新的EarthCAT,配合我们公司的带EarthCAT的伺服产品,目前带EarthCAT的伺服国内只有我们和汇川有,其他公司都没有,国外公司已经很常见了,机械臂使用的就是这种总线,100M超快。我们有一个CoMotion运动控制平台,目前在国产PLC里面算是高端产品,运动算法是买德国的。
广告完毕。说说PLC的定时器
代码我当然不能直接贴出来,公司秘密,并且是加密的,贴出来也是乱码
不过方式方法可以讨论,说不定遇到大神给出好的建议,获得产品提升空间
实现方法很简单
就是定义一个结构体,类似于
typedef struct strPLC_Timer{
strPLC_Timer *Next;
strPLC_Timer *Prev;
void (*pFun)(void *);
int Flag;
int Ticks;
void *Param;
}PLC_Timer;
结构体里面包含一个函数指针,指向用户定义的定时处理事件
定义PLC的定时器
PLC_Timer Timer[1024] = {0}; //支持1024个定时器
中断处理
void PLC_TimerISR(void)
{
PLC_Timer *pTemer = Timer;
.....
while(pTemer != NULL )
{
pTemer->Ticks--;
if( pTemer->Ticks == 0 )
{
....
pTemer->pFun( pTemer->Param);
....
}
pTemer = pTemer->Next;
}
}
中断函数就在一个计时器的中断里面调用,遍历整个链表,然后找到时间到达的节点,处理用户的定时事件
实际代码会更复杂一些,但是思路就是这样子
当然需要初始化函数,初始化静态链表,如果使用系统,可以使用动态链表节省空间
需要一个注册函数,把用户的事件,参数,定时周期初始化到一个节点上
还需要启动、停止和注销函数,以便用户各种操作
基本上一个硬件定时器就能实现N个定时器,还需要考虑的是CPU速度是否能在中断内轻松完成1024个定时器的处理,还有就是时间粒度,如果硬件设置为1us一次中断,那么用户必须这个时间很多才能准时,我们使用720M/1G的处理器,在这一点上还是非常轻松的
如果使用单片机,可能就支持不了多少个,但是可以使用这样的思路,还有就是单片机里面使用函数指针貌似有点不好使哦,STM32就没有这些问题,我用过
加载中...
查看其它8个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
我们公司 是深圳合信,PLC品牌叫科创思,在国产PLC里面比较好,仿西门子,去年还被西门子告侵权,不过官司我们赢了,我们的模块与西门子的可以互换,西门子的程序直接可以在我们的PLC内运行
高性能的中大型PLC不再仿西门子,使用TI的AM335x,有两款配置,一款720M主频,一款1G主频,接口使用最新的EarthCAT,配合我们公司的带EarthCAT的伺服产品,目前带EarthCAT的伺服国内只有我们和汇川有,其他公司都没有,国外公司已经很常见了,机械臂使用的就是这种总线,100M超快。我们有一个CoMotion运动控制平台,目前在国产PLC里面算是高端产品,运动算法是买德国的。
广告完毕。说说PLC的定时器
代码我当然不能直接贴出来,公司秘密,并且是加密的,贴出来也是乱码
不过方式方法可以讨论,说不定遇到大神给出好的建议,获得产品提升空间
实现方法很简单
就是定义一个结构体,类似于
typedef struct strPLC_Timer{
strPLC_Timer *Next;
strPLC_Timer *Prev;
void (*pFun)(void *);
int Flag;
int Ticks;
void *Param;
}PLC_Timer;
结构体里面包含一个函数指针,指向用户定义的定时处理事件
定义PLC的定时器
PLC_Timer Timer[1024] = {0}; //支持1024个定时器
中断处理
void PLC_TimerISR(void)
{
PLC_Timer *pTemer = Timer;
.....
while(pTemer != NULL )
{
pTemer->Ticks--;
if( pTemer->Ticks == 0 )
{
....
pTemer->pFun( pTemer->Param);
....
}
pTemer = pTemer->Next;
}
}
中断函数就在一个计时器的中断里面调用,遍历整个链表,然后找到时间到达的节点,处理用户的定时事件
实际代码会更复杂一些,但是思路就是这样子
当然需要初始化函数,初始化静态链表,如果使用系统,可以使用动态链表节省空间
需要一个注册函数,把用户的事件,参数,定时周期初始化到一个节点上
还需要启动、停止和注销函数,以便用户各种操作
基本上一个硬件定时器就能实现N个定时器,还需要考虑的是CPU速度是否能在中断内轻松完成1024个定时器的处理,还有就是时间粒度,如果硬件设置为1us一次中断,那么用户必须这个时间很多才能准时,我们使用720M/1G的处理器,在这一点上还是非常轻松的
如果使用单片机,可能就支持不了多少个,但是可以使用这样的思路,还有就是单片机里面使用函数指针貌似有点不好使哦,STM32就没有这些问题,我用过
一周热门 更多>