CODESYS2.3部分功能块源代码算法移植C源代码共享希...
本帖最后由 jiang887786 于 2015-1-16 11:54 编辑首先,我要说的是我读书少,表达意思不准确如有疑问请在下面的楼层提问。网上我没有搜索到类似的源代码,估计这是第一帖。由于功能块较多我不可能一次性全部发表&说明完整,可能以后我会陆续的发在下面的楼层。此功能块的原作者不知道是谁,呵呵。我只是根据IEC6113-3的标准ST语言改写成C语言。(当然,我不会C++,如果会的话我改成C++就完美了,c++在一个函数调用过程中可以一次性返回多个参数,就是类的公用部分参数吧?抱歉,书看的不多,也就不多说了。还是想啰嗦几句,哈哈。大神也可以指正我对c++的理解错误:比如c++里面有个函数(int)ACB_123){;;//许多语句…..},编译器编译时生成了(int)ACB_123)的机器码并且在单片机的某些flash存在,当其他函数调用(int)ACB_123)时编译器会分配相应的(int)ACB_123)里面使用的变量等等给系统使用,
当还有其他函数调用(int)(ACB_123)时编译器会分配相应的另一些(int)(ACB_123)里面使用的变量等等给系统使用,只是这些变量的地址不是上一次那个函数调用的变量地址了。而机器码还是原来的那部分机器码。就是你调用的再多次这个函数机器码只有这个机器码(节省flash看见相对于c来说。)而变量的地址不同了。从而返回的参数也不同了,这也是正确的结果。如果是c的话,你想在一个工程里面使用两个相同功能的函数的话,你只能吧一个函数复制成两个比如上面说的
(int)(ACB_123A){;;//许多语句…..}、
(int)(ACB_123B){;;//许多语句…..}、
(int)(ACB_123C){;;//许多语句…..}、
等等,只不过这三个(ACB_123函数内部的东西是一模一样的罢了)目前我就是这样做的,希望大神们给个高见解决我目前的窘态。哈哈!关于C&C++我就懂这么多吧。不扯了,下面开始正文。尼玛,正文都不知道扯到哪里了,让我看看想想……)花了将近2个月的时间才改写完成,最初改写是按照C51改的,最后感觉c51排不上大用场,还是用CW5.1+MC9S12XD256调试输出吧。所以现在才把这些源代码发给大家使用,(也是我兑奖K64—L5的非卡奖品想莫大承诺的,打算有时间就共享这些代码)有需要的哥们儿就顶一下哦。谢谢支持。还有,如果我侵犯原著的版权,请回帖或者告知本坛删帖,谢谢合作!谢谢大家。这里我要说的是从开始的一个模拟量输入到最后的两个uint量输出,进而用这两个模拟量赋值给pwm占空比寄存器输出两个pwm去控制两个比例阀的过程,这个功能在工程机械控制方面用途很多很多有了这个过程,大家同行就可以举一反三了,当然是给新入门的鸟看的,老鸟就不用喷我了。呵呵。下面开始正文!
word FB_RC( unsigned long int Input)
{ /*新加的FB-RC函数*/
static volatile word prev;
//Input++;
。。。。。。。。。。。
return prev;}
word FB_RC( unsigned long int Input)
函数,形参Input,unsigned long int类型。返回值word型,不用多说了,这个是内部函数,也是必须要使用的,RC充放电波形,这个大家都理解吧?对了为了防止非注册用户可以复制使用这些代码我将每个函数都打包上传附件吧,不然每人都直接复制走了,那么将给本坛增加负担了。呵呵。
word PL_MeanValue_Len50 /*循环渐进法求平均值*/
(word Input,byte Par_Length,byte Reset)
{
,。。。。。。。。
}
这个是求平均值的函数,由于ADC的速度太快,求个平均值比较平滑稳定,后面貌似还有类似的功能块呢好像。wordInput形参这个是输入的要处理的模拟量值,byte Par_Length 这个是要取平均值的个数最大50 ,byte Reset这个是调用时使用使用这个功能,0不使用,1使用。看到没人家写这个函数时考虑的还不少啊!哈哈。
byte DELAY_10MS(byte IN,word PT)
{static word PT_TEMP;
static byte run_flag=0,time_inte=0/*这个变量本来是在定时器中断函数中的全局变量现在特地定义在这里了*/;
if(((0==PT_TEMP)&run_flag&IN)|(IN&(0==PT)))
{return 1;}
if (IN&!run_flag)
{PT_TEMP=PT;}
if (IN&!time_inte)
{run_flag=1;}
if (!IN&!time_inte)
{run_flag=0;
PT_TEMP=0; }
if (time_inte&run_flag)
{PT_TEMP--;
time_inte=0;}/*定时器中断标志位全局变量bit类型,每次中断置一*/
return ((0==PT_TEMP)&run_flag);}
这个是我自己写的用定时器的一个延时程序,不耗机器资源。貌似效果不咋滴,因为水平有限,自己没没怎么搞出一二来,还请高手指点一下最好。下面的一些函数也使用到这个延时了,其实不用也行,在主函数里面不用实时调用反 复循环的函数就行了。我用它就是判断时间到了就调用一次反复循环的函数,不到就跳过。不理解的可以回帖讨论。
int JoyStick_Filter(word Joy_Input, word/*0~1023*/Par_Neg ,word Par_Pos,word Par_Zero ,word Par_Deadband /*0~100*/, int Par_Neg_Pro, int/*-100~100*/Par_Pos_Pro, word Par_Diff, byte Par_Pos_Dir_Switch,byte Par_Neg_Dir_Switch, byte Par_Not_Use_Dir_Switch,byte Par_Dir_Switch_Judge_Time ,byte Enable)
{
。。。。。。。。。。。。
}
看到了吧,这个函数就调用了,byte DELAY_10MS(byte IN,word PT)、word FB_RC( unsigned long int Input)、还有word PL_MeanValue_Len5(word Input,byte Par_Length,byte Reset),
好,说形参(word Joy_Input, 手柄的AD模拟量0-1023,Par_Neg 手柄最小值标定,当小于最小值是此函数不输出,保护机器误动作,高吧?呵呵。word Par_Pos手柄最大值标定,当手柄值大于最大值是此函数不输出,保护机器误动 作,,word Par_Zero 手柄中间值一般是512,word Par_Deadband手柄死区,就是让他打多少手柄没有输出,防止手柄中位不是2.5伏偏差的, int Par_Neg_Pro这个值一般取0, int/*-100~100*/Par_Pos_Pro这个值一般取0,, word Par_Diff改写c后这个值不使用了, byte Par_Pos_Dir_Switch改写c后这个值不使用了,byte Par_Neg_Dir_Switch改写c后这个值不使用了, byte Par_Not_Use_Dir_Switch改写c后这个值不使用了,byte Par_Dir_Switch_Judge_Time改写c 后这个值不使用了 ,byte Enable调用时使用使能使用此函数,非0使用,为零不使用。)这些代码都是不用考虑的,没有使用,if (0==Par_Not_Use_Dir_Switch) {
tb1= ((Joy_Input>Par_Pos) && (0==Par_Pos_Dir_Switch)) ;
/*T1(IN=tb1,pt=Par_Dir_Switch_Judge_Time);
Error_Pos_Dir_Switch=t1.Q;*/
Error_Pos_Dir_Switch=DELAY_10MS(tb1,Par_Dir_Switch_Judge_Time);
tb2= ((Joy_Input<Par_Neg) && (0==Par_Neg_Dir_Switch)) ;
/*T2(IN=tb1,pt=Par_Dir_Switch_Judge_Time);
Error_Neg_Dir_Switch=t2.Q;*/
Error_Neg_Dir_Switch=DELAY_10MS(tb2,Par_Dir_Switch_Judge_Time);}
这个函数的返回值是+10000到-10000,一般是0.5v-2.5v是0到-10000,2.5-4.5v是0到+10000输出,刚好一个手柄两个动作。后面的动作输出函数就是需要+10000到-10000的。
word JoyStick_to_Current_Valve( int Input_Control,/*-10000~10000*/
volatile word Input_Up_Accel,/*每隔100ms增加的占空比,Input_Up_Accel/10000*(Input_up_max_DutyCycle-Input_up_min_DutyCycle)*/
volatile word Input_Up_Dccel,/*每个100ms减少的占空比,Input_Up_Dccel/10000*(Input_up_max_DutyCycle-Input_up_min_DutyCycle)*/
volatile word Input_Down_Accel,/*每隔100ms增加的占空比,Input_Down_Accel/10000*(Input_down_max_DutyCycle-Input_down_min_DutyCycle)*/
volatile word Input_Down_Dccel,/*每个100ms减少的占空比,Input_Down_Dccel/10000*(Input_down_max_DutyCycle-Input_down_min_DutyCycle)*/
volatile word Input_up_min_DutyCycle,/*0~10000*/
volatile word Input_up_max_DutyCycle,/*0~10000*/
volatile word Input_down_min_DutyCycle,/*0~10000*/
volatile word Input_down_max_DutyCycle/*0~10000*/)
/*VAR*/
{
。。。。。。。。。。。
}
这个函数就是输入是+10000到-10000,输出两个uint变量的,然后去控制两个pwm占空比。在codesys可以返回两个uint。C语言里面不行,所以我改了最后返回值的地方,使用时要注意。说形参word JoyStick_to_Current_Valve( int Input_Control,/*-10000~10000*/正负10000输入形参,volatile word Input_Up_Accel,/*每隔100ms增加的占空比,Input_Up_Accel/10000*(Input_up_max_DutyCycle-Input_up_min_DutyCycle)*/
volatile wordInput_Up_Dccel,/*每个100ms减少的占空比,Input_Up_Dccel/10000*(Input_up_max_DutyCycle-Input_up_min_DutyCycle)*/
volatile word Input_Down_Accel,/*每隔100ms增加的占空比,Input_Down_Accel/10000*(Input_down_max_DutyCycle-Input_down_min_DutyCycle)*/
volatile word Input_Down_Dccel,/*每个100ms减少的占空比,Input_Down_Dccel/10000*(Input_down_max_DutyCycle-Input_down_min_DutyCycle)*/
volatile word Input_up_min_DutyCycle,/*0~10000*/up设置的最小占空比,亦即比例阀的起始电流
volatile word Input_up_max_DutyCycle,/*0~10000*/ up设置的最大占空比,亦即比例阀的最大电流
volatile word Input_down_min_DutyCycle,/*0~10000*/另一个动作,和上面的设置一样。
volatile word Input_down_max_DutyCycle/*0~10000*/)
好了,到这里基本是一个完整的过程了,写了我半天,累啊。欢迎大家同行讨论,工程机械方面的问题。谢谢大家,谢谢amoBBS.
编辑增加cede附件。
编辑添加codesys2.3编程epec文件指导。
居然没人顶一下,这个算法在网上其他地方肯定下不到的啊!自己顶一个吧!{:sad:} 顶一下,谢谢楼主!还没细看,回头再消化 写的不错 ,看了一会 ,没看明白 ,这些代码可以用到那呢 ? 顶一下,谢谢楼主!MARK 顶一下楼主。期望更多资料 qs6361036 发表于 2015-1-15 16:51
写的不错 ,看了一会 ,没看明白 ,这些代码可以用到那呢 ?
工程机械啊,比如说工程机械的机器轮胎转向,我我们就可以用一个电位器,做角度测量,电位器动多少油缸就控制轮胎转多少,根据电位器的模拟量,来控制油缸的行程。{:lol:} 楼主的排版该整理整理了,晚了就没发改了 jiang887786 发表于 2015-1-15 21:27
工程机械啊,比如说工程机械的机器轮胎转向,我我们就可以用一个电位器,做角度测量,电位器动多少油缸就 ...
噢 ,原来是这样用的 ,学习啦! 楼主那个公司的哦。 oldmen 发表于 2015-1-15 22:18
楼主那个公司的哦。
美通重工,www.mantall.com。兄弟可以去看看哦,多多交流! 不知道楼主用哪家的PLC,EPEC? oldmen 发表于 2015-1-15 22:39
不知道楼主用哪家的PLC,EPEC?
EPEC,赫斯莫,都用过,现在也在用飞思卡尔16位机做一些东西。你是哪里的公司?做什么的{:handshake:} 很受用,学习了 德国3S的codesys。 比较难在坛子里看到用codesys的,其实它是一个不错的PLC平台。和利时的plc就是用它做的。 hiberhe 发表于 2015-1-16 07:02
比较难在坛子里看到用codesys的,其实它是一个不错的PLC平台。和利时的plc就是用它做的。 ...
对的,和利时听说过,没使用过。阁下也比较了解这一块啊,多多交流!{:handshake:} 楼主能不能放点EPEC的资料哦,比如手册,下载线,等等什么的。 其实epec的我用的时间不长,现在都用赫斯莫了。我现在传些附件你看看能否用上吧。我现在不用epec了,当年派芬公司代理的epec。如果你接触过他们你应该有资料吧?attach://251879.rar 赫斯莫的资料也可以撒 oldmen 发表于 2015-1-16 11:57
赫斯莫的资料也可以撒
你是哪个公司的,做什么行业的?你还没说呢。{:lol:} 谢谢LZ精神可嘉但是貌似我暂时消化不了 我是做维修的,PLC是兴趣爱好,曾经在新大方的轮胎式运梁车是看见过EPEC 然后就比较感兴趣。我也上传点资料吧
全部是EPEC的codesys库文件 oldmen 发表于 2015-1-16 20:06
我是做维修的,PLC是兴趣爱好,曾经在新大方的轮胎式运梁车是看见过EPEC 然后就比较感兴趣。我也上传点资料 ...
谢谢分享,只是这些东西只能在codesys里面调用,我们看不见里面的结构。如果都能改成C,那就爽了,{:lol:} jiang887786 发表于 2015-1-16 07:51
对的,和利时听说过,没使用过。阁下也比较了解这一块啊,多多交流!...
正在做基于codesys的ecu开发 jiang887786 发表于 2015-1-16 11:50
其实epec的我用的时间不长,现在都用赫斯莫了。我现在传些附件你看看能否用上吧。我现在不用epec了,当年派 ...
现在国内EPEC的代理有2家,江苏杰瑞科技集团(江苏自动化研究所)也是一级代理(同时也有graf显示器等,以及自己开发的显示终端和控制器)。有兴趣可以跟我联系(本用户名@163.com),技术支持绝对到位(对codesys底层实现熟悉)。
P.S.: 价格应该也有优势(我做R&D,没太关注) codesys 贵{:sad:}啊, 基本的要50w,每出货一台还要另外的授权费用 楼主是搞平台车哪块的 hiberhe 发表于 2015-1-18 07:33
现在国内EPEC的代理有2家,江苏杰瑞科技集团(江苏自动化研究所)也是一级代理(同时也有graf显示器等,以及 ...
那么另一家是派芬吗,epec太贵了。你们现在自己有没有做基于codesys的控制器除了ecu 机器人天空 发表于 2015-1-18 08:35
楼主是搞平台车哪块的
.www.mantall.com,你可以看看。就是那些产品 一直以為只能用PASCAL , 沒想到還能用C !!! ali1019 发表于 2015-1-18 09:53
一直以為只能用PASCAL , 沒想到還能用C !!!
PASCAL不了解,显然它没有c流行好用,我感觉c++才和原来的ST语言很像。 jiang887786 发表于 2015-1-18 09:17
那么另一家是派芬吗,epec太贵了。你们现在自己有没有做基于codesys的控制器除了ecu ...
对。用于工程机械的ecu肯定比工业上的plc贯不少。我说的ecu就是基于codes的控制器,主要用于工程机械,基本于ttcontrol的ttc50/60兼容。 楼主讲的很详细 本帖最后由 ali1019 于 2015-1-18 14:41 编辑
jiang887786 发表于 2015-1-18 10:22
PASCAL不了解,显然它没有c流行好用,我感觉c++才和原来的ST语言很像。
我比較好奇的是 , LZ這樣的寫法如何通過編譯?
是不是在那裏可以設定?
如 A = B ;我的版本必須是這樣寫 A := B ;才能編譯
目前我只會用CFC功能 , ST不會用
自己寫的FUNCTION_BLOCK , 在CFC功能中系統會自己封裝成模塊,非常容易使用.
hiberhe 发表于 2015-1-18 07:33
现在国内EPEC的代理有2家,江苏杰瑞科技集团(江苏自动化研究所)也是一级代理(同时也有graf显示器等,以及 ...
MARK
為了一個展覽,臨時被迫接觸CODESYS, 結果就被深深吸引了,
目前只會用CFC大部分的功能 及Function Block 功能 , 其他通通不會更不用說底層了,
只可惜國內這一塊討論的並不多, 希望有機會向你請教. ali1019 发表于 2015-1-18 14:39
我比較好奇的是 , LZ這樣的寫法如何通過編譯?
是不是在那裏可以設定?
兄弟,我发的代码是c语言的,不是ST语言了。多多讨论。我懂得也不多,{:handshake:} 不懂啊。。。 谢谢分享。 其实ST语言有C语言基础的话,非常容易上手。我认为ST是IEC61131-3五种plc编程语言中最好用的。 结构文本只要有c语言或者其他高级语言的基础,看懂还是比较容易入门的。毕竟很多语法有相似的地方。 jiang887786 发表于 2015-1-15 22:27
美通重工,www.mantall.com。兄弟可以去看看哦,多多交流!
贵司待遇很好的,以前有朋友呆过;
PS : 不过放说,我没看明白你这个应用场合,;虽然你后面回复贴子说明白了,可琢磨半天也没发现我的领域有哪个地主用的上;杯具; hiberhe 发表于 2015-1-19 06:54
其实ST语言有C语言基础的话,非常容易上手。我认为ST是IEC61131-3五种plc编程语言中最好用的。 ...
是的 ,我感觉也和c很相似,比c还规范呢,比如它有END_IF和END_FOR THEN 等结束语句,这样才不会感觉很乱、 kinsno 发表于 2015-1-19 08:03
贵司待遇很好的,以前有朋友呆过;
PS : 不过放说,我没看明白你这个应用场合,;虽然你后面回复贴子说明白了 ...
不是吧,你朋友呆过?请问你朋友贵姓?啥名,?发消息我看看是否认识{:handshake:} ,待遇一般的。是老虎都吃人的,你懂的。 kinsno 发表于 2015-1-19 08:03
贵司待遇很好的,以前有朋友呆过;
PS : 不过放说,我没看明白你这个应用场合,;虽然你后面回复贴子说明白了 ...
你是做哪个领域的呢?发网址上来看看。 这语法有点像VHDL呢。 jiang887786 发表于 2015-1-19 08:07
不是吧,你朋友呆过?请问你朋友贵姓?啥名,?发消息我看看是否认识 ,待遇一般的。是老虎 ...
我同学搞PLC的,早5年就离开徐工了;
下意识的以为你是徐工的,点开网站一看,晕菜!
我现在做仪器行业,根本碰不着; 以前做类自动化开发的时候,也没用上你这个哦; 唯一能联系上的印象中有一个叫"比例阀"的东西吧; 浪里白条 发表于 2015-1-19 08:39
这语法有点像VHDL呢。
其实我反而觉得象汇编的感觉;哈哈; kinsno 发表于 2015-1-19 08:48
我同学搞PLC的,早5年就离开徐工了;
下意识的以为你是徐工的,点开网站一看,晕菜!
我现在做仪器行业,根本碰 ...
对 ,比例阀是主力,直线电机啊,油门电机啊,变量泵啊,什么的,就这些。 请教楼主, codesys 这玩意怎么个使用方法,是否是可以移植到单片机之类的东西上,然后用上位机直接对它编程。 semonpic 发表于 2015-1-19 10:20
请教楼主, codesys 这玩意怎么个使用方法,是否是可以移植到单片机之类的东西上,然后用上位机直接对它编 ...
这个有点难度,我懂得不多。我只是移植了很少部分源代码。你说的理论上行得通,但是要高手才行,呵呵 理论上codesys支持绝大多数处理器的,Plc上运行的是运行时(软plc),纯c写的。上位机现成的,且通用。可以实现控制器和显示器 ali1019 发表于 2015-1-18 14:39
我比較好奇的是 , LZ這樣的寫法如何通過編譯?
是不是在那裏可以設定?
我是把原来的st语言改写成c语言了,所以。这个程序的编译环境已经是飞思卡尔的CW5.1了呵呵。比codesys不是一个层次了。 学习,谢谢!!! 谢谢分享,网上这种资料很少,能否交流一下? hqw 发表于 2019-5-21 09:21
谢谢分享,网上这种资料很少,能否交流一下?
可以啊,怎么交流,哈哈! 本帖最后由 hqw 于 2019-5-27 08:46 编辑
jiang887786 发表于 2019-5-25 18:42
可以啊,怎么交流,哈哈!
可以加我扣扣:溜吧起吧肆物流散,哈哈哈
页:
[1]