点击【 大 中 小 】,可以选择字体的大小,以便你阅读.
VB接收到PLC的十六进制码如何转为10进制码?
大家好!本人最近使用VB6.0的MSCCOM控件与PLC通讯,PLC送过来的数据在PC端均显示为16进制数,如何把它转为十进制数呢?我前段时间也看过类似问题的贴子,现在我也遇到此问题,希望VB高手提供脚本程序?在此多谢大家了!急!!!
以下是对《VB接收到PLC的十六进制码如何转为10进制码?》的回复:
匿名回复:
设s是待转换的16进制/8进制数或字串:
16进制HEX -> 10进制DEC:
Val("&H" & s)
8进制OCT -> 10进制DEC:
Val("&O" & s)
匿名回复:
那反过来,如果我想把十进制数转换为十六进制或八进制数呢?
请问在VB中怎么做?有没有现成的函数?请教各位!
匿名回复:
那反过来,如果我想把十进制数转换为十六进制或八进制数呢?
请问在VB中怎么做?有没有现成的函数?请教各位!
匿名回复:
Hex(s)和Oct(s)
匿名回复:
知道了。
谢谢你,关公!
匿名回复:
非常感谢关公和hustsup两位先生的贴子,但我在按关公先生的方法试着搞时,又遇到问题,首先我在此交代一下,如我接收的字据是不确定的,我在脚本程序中把所有的数据(不管长度)经过转换均放在buf中,然后在TextBox控件中显示出来,显示脚本程序为:txtReceive.Text=buf,然后我可以把接收到的字数已按16进制显示出来了,如接收到的数为:C1,B0,B9,B9,B9,B8,8D;然后我按关公的提示在脚本程序中加了如下的脚本程序:
txtVal=Val("&h"&buf);
然后txtReceive.Text=buf改为
txtReceive.Text=txtVal;(注此处由原来buf改为txtVal)
然后其它不变.
编译执行之后提示实时错误为:溢出,并指出错误在增加的句子处,即:txtVal=Val("&h"&buf)错误!
请问关公你所教的方法是不是只是一个单独数据可转换,太多了则会溢出,应当怎么增加脚本程序呢?
希望能得到关公大哥的指点,在此多谢了!
匿名回复:
用Val()函数变换一个大于Long型的16进制数时会产生溢出。
如:Val("&H" & "C1B0B9B9B9B88D") 时产生溢出;
但如:Val("&H" & "C1,B0,B9,B9,B9,B8,8D") 时,由于逗点的分隔,它在遇到第一个非16进制字符时就结束,其结果只是第一个数得到变换,因此它不会溢出。
以上方法都不能把各个数据分离出来,正确的方法是用对应类型和下标量的数组,多次变换对应装入。
或仍用一个字符串变量逐个进行:数制变换->加分隔符->串接.
匿名回复:
还请注意:FX-PLC总是返回以字节为单位的16进制字串,用它表示位元件时不会有问题,但如果它表示的是字元件的值,是成对出现且低字节在前,高字节在后的。如返回"C1B0"是D0的值的话,应理解为:D0 = B0C1h = 45249。
同理如“12345678”是某个双字元件的值时,则应理解为:78563412h。
匿名回复:
非常感谢关大哥的贴子,我一早就上来看你的贴子,无奈小女子才疏学浅,对VB不是很熟,所以按你的方法东撞西撞还是不得要领.对了,原来我这程序是用来跟PLC通讯的,但现在是跟一个仪表通讯,所以读出来的数是长短不一的,这样好不好,我把接收的全部程序放在贴子里,烦关大哥帮忙一下如何,如修改好之后可发邮件到:LLL_Lenny@163.com给我,接收的程序如下:
Private Sub Comm1_OnComm()
Select Case Comm1.CommEvent
Case comEvCD
Case comEvCTS
Case comEvDSR
Case comEvRing
Case comEvReceive
Dim i%, Buf$
Buf = ""
InByte = Comm1.Input
For i = LBound(InByte) To UBound(InByte)
Buf = Buf + Hex(InByte(i)) + Chr(13) & Chr(10)
Next i
txtReceive.Text = Buf
Case comEvSend
End Select
End Sub
我是利用了MSCOMM控件的OnComm事件之CommEvent属性来触发接收,其中InByte在前面有局部声明:Dim InByte() As Byte
请关大哥帮忙修改如何?小女子在此多谢了.
匿名回复: