用于python的gurux dlms库。
gurux-dlms的Python项目详细描述
有关概述,请参见Gurux。
加入gurux社区或按照@Gurux进行项目更新。
gurux_dlms library是一个高性能的python组件,它可以帮助您读取与dlms/cosem兼容的电、煤气或水表。我们试图使组件易于使用,以至于您根本不需要了解协议。
更多信息请查看Gurux.DLMS。
我们正在更新gurux网页上的文档。
开始阅读时,应先阅读DLMS/COSEM FAQ。阅读有关创建自己的meter reading application或构建自己的meter reading application的说明 dlms/cosemmeter/simulator/proxy。
如果你有问题,可以在guruxForum中提问。
您可以使用任何想要的连接(TCP、串行、PLC)库。 gurux.dlms类只分析数据。
开始前
如果发现问题,请在此处报告: http://www.gurux.fi/project/issues/gurux.dlms.python
简单示例
首先需要安装库:
pipinstallgurux_dlms
使用前必须设置以下设备参数。 参数由制造商指定。
Firstimportgurux_dlms.fromgurux_dlmsimport*Alldefaultparametersaregiveninconstructor.//IsusedLogicanNameorShortNamereferencing.client=GXDLMSClient(True)
HDLC寻址
每个仪表都有自己的服务器地址。服务器地址分为逻辑地址和物理地址。 通常您可以使用值1表示仪表地址。您可以从仪表的序列号中计算服务器地址。 您可以使用getserveraddress方法。
//Countserveraddressfromserialnumber.serverAddress=CGXDLMSClient.getServerAddress(Serialnumber)//Countserveraddressfromlogicanandphysicaladdress.serverAddress=CGXDLMSClient.getServerAddress2(logicalAddress,physicalAddress,Addresssizeinbytes);
如果您使用的是iec握手,则必须首先发送identify命令并移动到模式e。
Supportforserialportisaddedlater.
设置参数后,可以尝试连接仪表。 首先应该发送snrm请求并处理ua响应。 之后,您将发送aarq请求并处理aare响应。
reply=GXReplyData()data=self.client.snrmRequest()ifdata:self.readDLMSPacket(data,reply)self.client.parseUAResponse(reply.data)size=self.client.limits.maxInfoTX+40self.replyBuff=bytearray(size)reply.clear()self.readDataBlock(self.client.aarqRequest(),reply)self.client.parseAareResponse(reply.data)reply.clear()ifself.client.authentication.value>Authentication.LOW.value:foritinself.client.getApplicationAssociationRequest():self.readDLMSPacket(it,reply)self.client.parseApplicationAssociationResponse(reply.data)
如果参数正确,则进行连接。 接下来,您可以读取关联视图并显示meter可以提供的所有对象。
#Read Association View from the meter.reply=GXReplyData()self.readDataBlock(self.client.getObjectsRequest(),reply)objects=self.client.parseObjects(reply.data,True)converter=GXDLMSConverter.GXDLMSConverter()converter.updateOBISCodeInformation(objects)
现在你可以阅读想要的东西了。读取后,必须通过发送 断开连接请求。
self.readDLMSPacket(self.client.disconnectRequest(),reply)#Close media.
defreadDLMSPacket2(self,data,reply):ifnotdata:returnnotify=GXReplyData()reply.error=0succeeded=Falserd=GXByteBuffer()ifnotreply.isStreaming():self.writeTrace("TX: "+self.now()+"\t"+GXByteBuffer.hex(data),TraceLevel.VERBOSE)self.media.sendall(data)msgPos=0count=100pos=0try:whilenotself.client.getData(rd,reply,notify):ifnotify.data.size!=0:ifnotnotify.isMoreData():t=GXDLMSTranslator(TranslatorOutputType.SIMPLE_XML)xml=t.dataToXml(notify.data)print(xml)notify.clear()msgPos=rd.positioncontinuerd.position=msgPosrd.set(self.media.recv(100))ifpos==3:raiseValueError("Failed to receive reply from the device in given time.")ifpos!=0:print("Data send failed. Try to resend "+str(pos)+"/3")++posexceptExceptionase:self.writeTrace("RX: "+self.now()+"\t"+rd.__str__(),TraceLevel.ERROR)raiseeself.writeTrace("RX: "+self.now()+"\t"+rd.__str__(),TraceLevel.VERBOSE)ifreply.error!=0:raiseGXDLMSException(reply.error)