威纶通官方论坛

各位大侠帮忙看看这个宏程序为啥运算结果溢出了?实在是想不明白。

  [复制链接]
发表于 2011-9-16 14:55:26 | 显示全部楼层 |阅读模式
//用MT6070IH连接一个自由通信的设备。
屏发送帧:03 04 2D 01 00 02 28 85
设备应答帧:03 04 04 00 EA 00 1A 78 7B
对应关系:rece[0]=03
               rece[1]=04
               。。。。。。
          。。。。。。
               rece[8]=7B
LW4=65514不知为什么是这个值,应该是234才对啊
LW5=26这个是对的
实在是弄不明白了。
macro_command main()
char temp
char send[10],rece[10]
short addr,CRC16
char return_value
short total
addr=11521
send[0]=3//从设备站号
send[1]=0x04//功能码
send[2]=addr/256//地址高位
send[3]=addr%256//地址低位
send[4]=0x00//读取字节数
send[5]=0x02//读取字节数
CRC(send[0], CRC16, 6)//CRC校验
LOBYTE(CRC16, send[6])//取CRC低位
HIBYTE(CRC16, send[7])//取CRC高位
OUTPORT(send[0], "Free Protocol", 8)
INPORT(rece[0], "Free Protocol", 9, return_value)
CRC(rece[0], CRC16, 7)
LOBYTE(CRC16, send[6])
HIBYTE(CRC16, send[7])
if return_value>0 and rece[7]==send[6] and rece[8]==send[7] then
    total=rece[3]*256+rece[4]
    SetData(total, "Local HMI", LW, 4, 1)//结果存在LW4中
    total=rece[5]*256+rece[6]
    SetData(total, "Local HMI", LW, 5, 1)//结果存在LW5中
end if
end macro_command
发表于 2011-9-16 15:27:48 | 显示全部楼层
你收到的rece[3]是ff...你用setdate看是不是  如果是就是你设备应答的问题了...
发表于 2011-9-16 15:27:56 | 显示全部楼层
1  "if return_value>0 and rece[7]==send[6] and rece[8]==send[7] then"
这个条件根本不成立
2  如果条件成立,把LW寄存器的数据格式都改成unsigned在尝试一下
 楼主| 发表于 2011-9-16 15:46:48 | 显示全部楼层
本帖最后由 SJS 于 2011-9-16 15:51 编辑

回复2楼:我用setdata把rece[3]写到LW中,然后用“数值显示"元件显示,结果是0
回复3楼:上面的那个条件成立,而且LW已经是16bit-unsigned
发表于 2011-9-16 15:51:04 | 显示全部楼层
回复 4# SJS


    没有顺便看看rece[4]的...
发表于 2011-9-16 15:53:26 | 显示全部楼层
回复 4# SJS


    强烈建议你把开始设定的各种参数都初始化为0一下...否则重复使用...
 楼主| 发表于 2011-9-16 15:56:30 | 显示全部楼层
rece[3]=0
rece[4]=234
 楼主| 发表于 2011-9-16 16:01:23 | 显示全部楼层
我用串口监视485总线的数据为:03 04 2D 01 00 02 28 85 03 04 04 00 EA 00 1A 78 7B
 楼主| 发表于 2011-9-16 16:05:22 | 显示全部楼层
本帖最后由 SJS 于 2011-9-16 16:06 编辑

防止数据类型不匹配我把
total=rece[3]*256+rece[4]
改成
total=rece[3]
total=total*256+rece[4]   
也不好用!!!!!不知道到底是哪出了问题。
发表于 2011-9-16 16:06:09 | 显示全部楼层
回复 7# SJS


    rece[3]=0  rece[4]=234
    而你显示出来的total的值是rece[3]=ff的情况下计算出来的
   在 total=rece[3]*256+rece[4]前面手动赋值给他 rece[3]=0
再试一试  如果还是显示的不是234
不负责任的猜想一下   可能是lw的地址出现了重复使用吧...
在最开始开始先把参数初始化一下吧...
 楼主| 发表于 2011-9-16 16:11:50 | 显示全部楼层
回复 10# w316746147

这个我试过了
  rece[3]=0
  total=rece[3]*256+rece[4]
total的结果为234
发表于 2011-9-16 16:19:19 | 显示全部楼层
回复 11# SJS


    那就奇怪了 你setdate的是0  计算时调用的却是ff  ...
能发一下你setdate的位置是放在哪的么
目前没思路...
要不然用一下^和0运算复制一下试试?
 楼主| 发表于 2011-9-16 16:27:56 | 显示全部楼层
SetData(rece[3], "Local HMI", LW, 4, 1)
SetData(rece[4], "Local HMI", LW, 5, 1)
然后用2个数值显示元件显示LW4,LW5的值。
发表于 2011-9-16 16:39:49 | 显示全部楼层
回复 13# SJS


    最好在原有的基础上 你的lw 4和5都还显示total的值  然后再额外创建一个数值原件显示rece[3]的值  把sedate(rece[3]......)这个就放在setdate(total.....)的后面同步显示   如果还显示rece[3]=0,total却还是655..的话 那应该是宏的char转short时的问题  不如把total也定义为char...
 楼主| 发表于 2011-9-16 16:56:07 | 显示全部楼层
本帖最后由 SJS 于 2011-9-16 16:57 编辑

total=rece[3]*256+rece[4]
    SetData(total, "Local HMI", LW, 4, 1)//结果存在LW4中
    SetData(rece[3], "Local HMI", LW, 6, 1)//结果存在LW4中
    total=rece[5]*256+rece[6]
    SetData(total, "Local HMI", LW, 5, 1)//结果存在LW5中
结果:LW4=65514
          LW5=23
         LW6=0
 楼主| 发表于 2011-9-16 17:01:42 | 显示全部楼层
我发现了个奇怪的问题就是rece[3]不为0的时候就正常了,只要为0就有这个问题。
发表于 2011-9-16 17:03:12 | 显示全部楼层
回复 15# SJS


    类型转换的问题吧...
应该是了...
无能为力
统一类型试试吧...
发表于 2011-9-16 17:04:21 | 显示全部楼层
回复 16# SJS

哦...那不是类型的问题了...
 楼主| 发表于 2011-9-16 18:15:37 | 显示全部楼层
本帖最后由 SJS 于 2011-9-16 18:18 编辑

哪都得定义成short了,可我的这个是测试的,实际当中一次得接收60多个字节哪?那也太浪费空间了。
无语了????????
有没有别的办法了啊。
发表于 2011-9-18 11:09:02 | 显示全部楼层
在变量前面加个unsigned short 试试,你把你的宏都发上来看看,我测试下是否有问题。
您需要登录后才可以发帖 登录 | 注册

本版积分规则

回复帖子

Archiver|小黑屋|威纶通官网 ( 粤ICP备06054553号 )

GMT+8, 2024-5-29 00:46

Powered by Discuz! X3.4

© 2001-2023 Comsenz Inc.

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