发新帖本帖赏金 15.00元(功能说明)我要提问
12下一页
返回列表
打印
[程序源码]

回忆N年前玩电时代的美好时光----软件篇【独创+连载】

[复制链接]
6069|28
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
laoxu|  楼主 | 2015-12-20 19:59 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 laoxu 于 2015-12-20 20:04 编辑

回忆往事,玩过的设计不计其数,分布在机电化光各领域。唯独这个软件编的最辛苦。

那时,客户指定产品要配三菱PLC, 让玩单片机的我没了方向,那时一个FX1S要2千多,运算精度要求又高,最好用浮点运算,而支持浮点数的三菱FX2N, 必须要外扩好几个高速模块才能达到要求,一算下来要近万元,成本实在太高了,吃不消,最后选择了FX1N, 3千多,凑合用用吧。

FX1N浮点数不支持,咱就用32位长整数吧,加减乘除里面就算32位/32位除法精度最低,故扩展编制了64位/32位整数除法, 程序编好试运行中,偶而会出错,经分析,数据的动态范围太大,计算溢出所造成的。

因此,恨下心来要搞浮点运算,玩过PLC的都知道,那个梯型图啊,比汇编都难弄,要扩展浮点运算,就要先搞些最基本的指令组合,比如,扩展的加减法,玩过单片机的都知道, 两个补码相加,溢出时尾数还留在ACC中,并且是正确的。
而三菱PLC, 两数相加减,一但上溢出或下借位,其结果不知为啥数,研究了半天也搞不懂,只能放弃。更要命的,FX1N不支持常用的移位指令,让我想了足足一个多月,白天想晚上睡觉也在思考,总算找到变通之法。


从此,N年过去了,全世界都没有过类似的设计,支持FX1N(FX1S)的专用浮点运算库,在上一世纪诞生了!

打赏榜单

21ic小喇叭 打赏了 10.00 元 2015-12-21

相关帖子

沙发
laoxu|  楼主 | 2015-12-20 20:00 | 只看该作者
本帖最后由 laoxu 于 2015-12-21 08:37 编辑

由于年代久远,现找出来重新编译了一下,加了点文字说明。

使用方法:

先在全局软元件中,定义几个DW型数据寄存器,DW_A, DW_B, DW_C

程序规定:
DW_A, DW_B 为输入, DW_C 为计算值输出

由此可得:

DW_C = FWADD(DW_A, DW_B);       // 浮点数 DW_A + DW_B
DW_C = FWSUB(DW_A, DW_B);       // 浮点数 DW_A - DW_B
DW_C = FWMUL(DW_A, DW_B);       // 浮点数 DW_A * DW_B
DW_C = FWDIV(DW_A, DW_B);       // 浮点数 DW_A / DW_B
DW_C = FWABS(DW_A);             // 浮点数 DW_A 求绝对值
DW_C = FWNEG(DW_A);             // 浮点数 DW_A 求补码

使用特权

评论回复
板凳
laoxu|  楼主 | 2015-12-20 20:00 | 只看该作者
本帖最后由 laoxu 于 2015-12-21 08:41 编辑

程序实例:



浮点数加法  D100 + D102 ,  结果送 D104




浮点数减法  D100 -  D102 ,  结果送 D104



浮点数乘法  D100 * D102 ,  结果送 D104






使用特权

评论回复
地板
laoxu|  楼主 | 2015-12-20 20:00 | 只看该作者
本帖最后由 laoxu 于 2015-12-21 08:45 编辑


浮点数除法  D100 /  D102 ,  结果送 D104




浮点数求补码,  D100 求补后  ,  结果送 D104




浮点数求绝对值, 求得 D100  的绝对值,   送 D104



使用特权

评论回复
5
laoxu|  楼主 | 2015-12-20 20:00 | 只看该作者
本帖最后由 laoxu 于 2015-12-21 12:57 编辑

三菱公司新版的 GX Works2 ,支持 FB库,将上述子程序打个包,包装一下,组成 FB库,调用更方便。



程序实例:



浮点数加法  D100 + D102 ,  结果送 D104




浮点数减法  D100 -  D102 ,  结果送 D104




浮点数乘法  D100 * D102 ,  结果送 D104


使用特权

评论回复
6
laoxu|  楼主 | 2015-12-20 20:00 | 只看该作者
本帖最后由 laoxu 于 2015-12-21 12:58 编辑



浮点数除法  D100 /  D102 ,  结果送 D104




浮点数求绝对值, 求得 D100  的绝对值,   送 D104



浮点数求补码,  D100 求补后  ,  结果送 D104



使用特权

评论回复
7
laoxu|  楼主 | 2015-12-20 20:00 | 只看该作者
本帖最后由 laoxu 于 2015-12-21 13:09 编辑


浮点数PID运算,经验公式 uk = Kp * (2.45 * ek - 3.5 * ek-1 + 1.25 * ek-2),
其中:Kp   = D90  ;
      ek   = D100 ;   
      ek-1 = D102 ;   
      ek-2 = D104 ;   
结算结果:  
      uk 存放在 D110 中。





64位长整数,除 32位整数,  商为 32位整数。

其中 D100 为 被除数 低 32位值, D102 为 被除数 高 32位值, D102 为 32位 除数, 计算结果(商)存放在 D110中。


使用特权

评论回复
8
laoxu|  楼主 | 2015-12-20 20:00 | 只看该作者
本帖最后由 laoxu 于 2015-12-22 04:37 编辑

浮点运算子程序设计要点:

由于FN1N支持的指令有限,在浮点运算中,使用软元件辅助继电器 M0-M31, M32-M63,模拟单片机的 32位累加器,进行加减及移位运算。

为提高运算精度,实际操作时,将数据扩大一倍,计算结果再缩小一倍,并对最末尾进行四舍五入处理。




在 64位/32位 整数除法运算中,使用软元件辅助继电器 M0-M63,模拟单片机的 64位累加器,进行加减及移位运算。


使用特权

评论回复
9
laoxu|  楼主 | 2015-12-20 20:00 | 只看该作者
本帖最后由 laoxu 于 2015-12-22 04:38 编辑

有了模拟累加器,编程就简单了。

1. 浮点数加减运算,先取出符号、指数,对尾数进行对阶操作,再尾数相加减,最后结果规格化回送。

2. 浮点数乘法运算,先取出符号、指数,指数相加,再尾数相乘,由于FN1N支持32位整数乘法,故计算还算简单,最后结果规格化回送。

3. 浮点数除法运算,先取出符号、指数,指数相减,再尾数相除,由于精度要求,这个尾数相除比较麻烦,只能通过32位整数除法,先除取商,再用余数扩展后再除取商,一直循环到商为0, 最后将商按比例缩小后相加,得到运算结果,最后是规格化回送。

4. 64位/32位 整数除法运算,先取出符号、将数据转换成正数,由于精度要求,只能通过32位整数除法,先除取商,再用余数扩展后再除取商,一直循环到商为0, 最后将商按比例缩小后相加,得到运算结果,最后是放回符号回送。

使用特权

评论回复
10
laoxu|  楼主 | 2015-12-20 20:00 | 只看该作者
本帖最后由 laoxu 于 2015-12-23 08:35 编辑

关于浮点数赋值:

由于FX1N不支持浮点数,因此需人工计算,将浮点数转换成十六进制数,以 DMOV 指令格式,对软元件赋值。


一种比较简单的方法是,先将 PLC类型改为支持 浮点数赋值 的型号,比如 FX3U , 用 DEMOV 指令格式,对软元件进行浮点数赋值。

再打开模拟调试,以十六进制方式显示赋值,记下,最后用 DMOV 指令格式,重新用此 十六进制数,对软元件赋值即可 。


下图中,两条指令等价。



上一条是指令格式, 是 FX3U 用 DEMOV 指令,将浮点数 E1.23456 赋值给软元件 d100-D101。

下一条是指令格式, 是 FX1N 用 DMOV 指令,将浮点数 H3F9E0610(即浮点数 E1.23456) 赋值给软元件 d100-D101。



FX1N浮点子程序库 下载,  GX Works2 工程格式

FX1N浮点子程序库.rar (188.89 KB)


======================= 全文连载完 =======================

使用特权

评论回复
11
dirtwillfly| | 2015-12-20 20:42 | 只看该作者
坐等楼主讲解

使用特权

评论回复
12
huangqi412| | 2015-12-20 21:25 | 只看该作者
占个位卖瓜子

使用特权

评论回复
13
penguin008| | 2015-12-21 09:38 | 只看该作者
坐等楼主更新啦~!

使用特权

评论回复
14
Meyeah| | 2015-12-21 10:12 | 只看该作者
占个坑

使用特权

评论回复
15
ayl439| | 2015-12-21 11:37 | 只看该作者
坐等~~~

使用特权

评论回复
16
laoxu|  楼主 | 2015-12-21 13:11 | 只看该作者
已更新!

使用特权

评论回复
17
电子老鹰| | 2015-12-21 14:40 | 只看该作者
最关键的浮点运算子程序是怎么实现的  没写出来

使用特权

评论回复
18
laoxu|  楼主 | 2015-12-21 15:08 | 只看该作者
电子老鹰 发表于 2015-12-21 14:40
最关键的浮点运算子程序是怎么实现的  没写出来

不用急。。。。。。

会全部贡献出来的,包括源程序,思路,等等。。。。。。

使用特权

评论回复
19
laoxu|  楼主 | 2015-12-22 04:37 | 只看该作者
本帖最后由 laoxu 于 2015-12-22 07:20 编辑

浮点运算子程序设计要点:

由于FN1N支持的指令有限,在浮点运算中,使用软元件辅助继电器 M0-M31, M32-M63,模拟单片机的 32位累加器,进行加减及移位运算。

为提高运算精度,实际操作时,将数据扩大一倍,计算结果再缩小一倍,并对最末尾进行四舍五入处理。




在 64位/32位 整数除法运算中,使用软元件辅助继电器 M0-M63,模拟单片机的 64位累加器,进行加减及移位运算。

使用特权

评论回复
20
laoxu|  楼主 | 2015-12-22 04:38 | 只看该作者
本帖最后由 laoxu 于 2015-12-22 07:20 编辑

有了模拟累加器,编程就简单了。

1. 浮点数加减运算,先取出符号、指数,对尾数进行对阶操作,再尾数相加减,最后结果规格化回送。

2. 浮点数乘法运算,先取出符号、指数,指数相加,再尾数相乘,由于FN1N支持32位整数乘法,故计算还算简单,最后结果规格化回送。

3. 浮点数除法运算,先取出符号、指数,指数相减,再尾数相除,由于精度要求,这个尾数相除比较麻烦,只能通过32位整数除法,先除取商,再用余数扩展后再除取商,一直循环到商为0, 最后将商按比例缩小后相加,得到运算结果,最后是规格化回送。

4. 64位/32位 整数除法运算,先取出符号、将数据转换成正数,由于精度要求,只能通过32位整数除法,先除取商,再用余数扩展后再除取商,一直循环到商为0, 最后将商按比例缩小后相加,得到运算结果,最后是放回符号回送。

使用特权

评论回复

打赏榜单

21ic小喇叭 打赏了 5.00 元 2015-12-22

发新帖 本帖赏金 15.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

146

主题

2274

帖子

221

粉丝