您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > VB编写的Modbus RTU协议通讯源程序
modbusrtu协议可以算是一种事实上的工业标准协议,为许多仪表、PLC等所支持。以前有几个用户问如何使用VB编程来与我们的KND-K3系列PLC通讯,于是整了一个demo程序。这次把这个demo共享,希望能给大家一点帮助。1)模块文件:modCRC,其中包含了CRC校验的函数。'data待校验的数组名称'no数组中元素个数'btLoCRC算出的CRC高字节'btHiCRC算出的CRC低字节PublicFunctionCalCRC16Fast(data()AsByte,noAsInteger,btLoCRCAsByte,btHiCRCAsByte)AsStringDimCLAsByte,CHAsByte'多项式码&HA001DimSaveHiAsByte,SaveLoAsByteDimiAsIntegerDimFlagAsIntegerbtHiCRC=&HFFbtLoCRC=&HFFCL=&H1CH=&HA0Fori=0To(no-1)btHiCRC=btHiCRCXordata(i)'每一个数据与CRC寄存器进行异或ForFlag=0To7SaveHi=btLoCRCSaveLo=btHiCRCbtLoCRC=btLoCRC\2'高位右移一位btHiCRC=btHiCRC\2'低位右移一位If((SaveHiAnd&H1)=&H1)Then'如果高位字节最后一位为1btHiCRC=btHiCRCOr&H80'则低位字节右移后前面补1EndIf'否则自动补0If((SaveLoAnd&H1)=&H1)Then'如果LSB为1,则与多项式码进行异或btLoCRC=btLoCRCXorCHbtHiCRC=btHiCRCXorCLEndIfNextFlagNextiDimReturnData(1)AsByteReturnData(0)=btHiCRC'CRC高位ReturnData(1)=btLoCRC'CRC低位CalCRC16Fast=ReturnDataEndFunctionPublicFunctionCalCRC16Tbl(data()AsByte,noAsInteger,btLoCRCAsByte,btHiCRCAsByte)AsStringDimbtLoCRCAsByteDimbtHiCRCAsBytebtLoCRC=&HFFbtHiCRC=&HFFDimiAsIntegerDimiIndexAsLongFori=0To(no-1)iIndex=btHiCRCXordata(i)btHiCRC=btLoCRCXorGetCRCLo(iIndex)'低位处理btLoCRC=GetCRCHi(iIndex)'高位处理NextiDimReturnData(1)AsByteReturnData(0)=btHiCRC'CRC高位ReturnData(1)=btLoCRC'CRC低位CalCRC16Tbl=ReturnDataEndFunction'CRC低位字节值表FunctionGetCRCLo(IndAsLong)AsByteGetCRCLo=Choose(Ind+1,_&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,&H1,&HC0,_&H80,&H41,&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,_&H0,&HC1,&H81,&H40,&H0,&HC1,&H81,&H40,&H1,&HC0,_&H80,&H41,&H1,&HC0,&H80,&H41,&H0,&HC1,&H81,&H40,_&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,&H0,&HC1,_&H81,&H40,&H1,&HC0,&H80,&H41,&H1,&HC0,&H80,&H41,_&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,&H0,&HC1,_&H81,&H40,&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,_&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,&H1,&HC0,_&H80,&H41,&H0,&HC1,&H81,&H40,&H0,&HC1,&H81,&H40,_&H1,&HC0,&H80,&H41,&H1,&HC0,&H80,&H41,&H0,&HC1,_&H81,&H40,&H1,&HC0,&H80,&H41,&H0,&HC1,&H81,&H40,_&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,&H1,&HC0,_&H80,&H41,&H0,&HC1,&H81,&H40,&H0,&HC1,&H81,&H40,_&H1,&HC0,&H80,&H41,&H0,&HC1,&H81,&H40,&H1,&HC0,_&H80,&H41,&H1,&HC0,&H80,&H41,&H0,&HC1,&H81,&H40,_&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,&H1,&HC0,_&H80,&H41,&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,_&H0,&HC1,&H81,&H40,&H0,&HC1,&H81,&H40,&H1,&HC0,_&H80,&H41,&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,_&H1,&HC0,&H80,&H41,&H0,&HC1,&H81,&H40,&H1,&HC0,_&H80,&H41,&H0,&HC1,&H81,&H40,&H0,&HC1,&H81,&H40,_&H1,&HC0,&H80,&H41,&H1,&HC0,&H80,&H41,&H0,&HC1,_&H81,&H40,&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,&H0,&HC1,&H81,&H40,&H1,&HC0,&H80,&H41,&H1,&HC0,&H80,&H41,&H0,&HC1,&H81,&H40)EndFunction'CRC高位字节值表FunctionGetCRCHi(IndAsLong)AsByteGetCRCHi=Choose(Ind+1,_&H0,&HC0,&HC1,&H1,&HC3,&H3,&H2,&HC2,&HC6,&H6,&H7,&HC7,&H5,&HC5,&HC4,&H4,&HCC,&HC,&HD,&HCD,&HF,&HCF,&HCE,&HE,&HA,&HCA,&HCB,&HB,&HC9,&H9,&H8,&HC8,&HD8,&H18,&H19,&HD9,&H1B,&HDB,&HDA,&H1A,&H1E,&HDE,&HDF,&H1F,&HDD,&H1D,&H1C,&HDC,&H14,&HD4,&HD5,&H15,&HD7,&H17,&H16,&HD6,&HD2,&H12,&H13,&HD3,&H11,&HD1,&HD0,&H10,&HF0,&H30,&H31,&HF1,&H33,&HF3,&HF2,&H32,&H36,&HF6,&HF7,&H37,&HF5,&H35,&H34,&HF4,&H3C,&HFC,&HFD,&H3D,&HFF,&H3F,&H3E,&HFE,&HFA,&H3A,&H3B,&HFB,&H39,&HF9,&HF8,&H38,&H28,&HE8,&HE9,&H29,&HEB,&H2B,&H2A,&HEA,&HEE,&H2E,&H2F,&HEF,&H2D,&HED,&HEC,&H2C,&HE4,&H24,&H25,&HE5,&H27,&HE7,&HE6,&H26,&H22,&HE2,&HE3,&H23,&HE1,&H21,&H20,&HE0,&HA0,&H60,_&H61,&HA1,&H63,&HA3,&HA2,&H62,&H66,&HA6,&HA7,&H67,&HA5,&H65,&H64,&HA4,&H6C,&HAC,&HAD,&H6D,&HAF,&H6F,&H6E,&HAE,&HAA,&H6A,&H6B,&HAB,&H69,&HA9,&HA8,&H68,&H78,&HB8,&HB9,&H79,&HBB,&H7B,&H7A,&HBA,&HBE,&H7E,&H7F,&HBF,&H7D,&HBD,&HBC,&H7C,&HB4,&H74,&H75,&HB5,&H77,&HB7,&HB6,&H76,&H72,&HB2,&HB3,&H73,&HB1,&H71,&H70,&HB0,&H50,&H90,&H91,&H51,&H93,&H53,&H52,&H92,&H96,&H56,&H57,&H97,&H55,&H95,&H94,&H54,&H9C,&H5C,&H5D,&H9D,&H5F,&H9F,&H9E,&H5E,&H5A,&H9A,&H9B,&H5B,&H99,&H59,&H58,&H98,&H88,&H48,&H49,&H89,&H4B,&H8B,&H8A,&H4A,&H4E,&H8E,&H8F,&H4F,&H8D,&H4D,&H4C,&H8C,&H44,&H84,&H85,&H45,&H87,&H47,&H46,&H86,&H82,&H42,&H43,&H83,&H41,&H81,&H80,&H40)EndFunction2)窗体:FORM1,上面放置的控件如下:BeginVB.FormfrmComCaption=Form1ClientHeight=8235ClientLeft=3885ClientTop=2250ClientWidth=6810LinkTopic=Form1ScaleHeight=8235ScaleWidth=6810BeginVB.TextBoxtxtReceive‘注:放置接收上来的IB0数据Height=495Left=1200TabIndex=2Top=2280Width=1335EndBeginVB.CommandButtonCommand1Caption=读取IB0Height=495Left=2760TabIndex=1Top=2280Width=1695EndBeginVB.CommandButtoncmdSDOCaption=置位Q1.1Height=495Left=2160TabIndex=0Top=3720Width=1575EndBeginMSCommLib.MSCommComK3Left=480Top=1080_ExtentX=1005_ExtentY=1005_Version=393216DTREnable=-1'TrueEndEnd①Form_Load事件,在此主要是实现了打开并初始化串口PrivateSubForm_Load()WithComK3.CommPort=1.Settings=19200,N,8,1.InputMode=comInputModeBinary'二进制收发.InBufferSize=512.OutBufferSize=512If(Not.PortOpen)Then.PortOpen=TrueEndWithEndSub②Form_UnLoad事件,在此主要是关闭串口PrivateSubForm_Unload(CancelAsInteger)If(ComK3.PortOpen)ThenComK3.PortOpen=FalseEndIfEndSub③“置位Q1.1”按钮单击事件'设置Q1.1为1PrivateSubcmdSDO_Click()DimbtSend(8)AsBytebtSend(0)=&H1'目标站号btSend(1)=&H5'功能码btSend(2)=&H0'Q1.1地址(0009)高字节btSend(3)=&H9'Q1.1地址(0009)低字节btSend(4)=&HFF'强制值高字节btSend(5)=&H0'强制值低字节DimcrcDimbtCRCHiAsByte,btCRCLoAsByte
本文标题:VB编写的Modbus RTU协议通讯源程序
链接地址:https://www.777doc.com/doc-6134486 .html