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