我主要是一个PLC程序员,任务是编写一些代码在Raspberry Pi2B(Raspbian Wheezzy)上运行,从RPi上运行的另一个进程中获取一些数据,并使这些数据在Modbus TCP(旧的PLC协议)接口上可用。我有它的功能,但现在正在努力防弹。我为IPC选择了命名管道,这就是我的问题所在。在Python(v2.7)示例代码中,如果我启动reader,它将打开并转到readline命令并按预期进行块。当我启动我的writer并选择打开、写入和关闭管道时,它会按预期执行并向管道写入一个记录。然而,读卡器只是坐在那里阻止readline命令。当编写器循环返回并询问是否打开管道时,如果我选择“y”,则我的读者会吐出先前循环中写入的记录。我很高兴我得到了我的数据,但是我不明白为什么“打开”writer中的管道会导致读者在那时获取数据。我想我会在我的作者写下记录后看到读到的数据。另外,我认为在Writer代码中“关闭”管道没有任何作用,因为我可以在第一次通过逻辑打开管道,编写一个记录,然后在下一次通过逻辑时,我可以选择不打开管道,仍然可以成功地编写它。在
先谢谢你,对我好一点……记住,我只是一个被迫进入Python世界的老PLC程序员!在
作者:
#!/usr/bin/env python
import logging
logging.basicConfig(format='%(asctime)s %(message)s')
log = logging.getLogger()
log.setLevel(logging.DEBUG)
log.debug('Logging has started')
log.debug('DocTest Pipe Writer')
import os, time, sys
PipeName = 'DocTestPipe'
if not os.path.exists(PipeName):
log.debug('Pipe not present...Creating...')
os.mkfifo(PipeName, 0777)
log.debug('Pipe is made')
else:
log.debug('Pipe already present')
ModbusSeed = 0
while True:
OpenPipe = raw_input ('Open pipe? y or n')
if OpenPipe == 'y':
log.debug('Opening pipe')
PipeOut = open(PipeName, 'w')
log.debug('Pipe is open for writing.')
else:
log.debug('Chose not to open pipe')
DataPipeString = '%05d' % ModbusSeed+','+'%05d' % (ModbusSeed+1)+','+'%05d' % (ModbusSeed+2)+','+ \
'%05d' % (ModbusSeed+3)+','+'%05d' % (ModbusSeed+4)+','+'%05d' % (ModbusSeed+5)+','+ \
'%05d' % (ModbusSeed+6)+','+'%05d' % (ModbusSeed+7)+','+'%05d' % (ModbusSeed+8)+','+ \
'%05d' % (ModbusSeed+9)+'\n'
print 'Pipe Data to write: '+DataPipeString
WritePipe=raw_input('Write Pipe? y or n')
if WritePipe == 'y':
log.debug('Writing pipe')
PipeOut.write(DataPipeString)
log.debug('Pipe is written.')
ClosePipe = raw_input('Close pipe? y or n')
if ClosePipe == 'y':
log.debug('Closing pipe')
PipeOut.close
log.debug('Pipe is closed')
else:
log.debug('Pipe left open')
ModbusSeed=ModbusSeed+1
读者:
^{pr2}$
在绞尽脑汁,搜索互联网,反复试验之后,我终于有了答案。问题的关键在于,当我打开管道进行写操作时,我没有指定“缓冲”参数。这导致我的管道写入缓存在缓冲区的某个地方,而不是立即写入管道。每当我“打开”我的写管道时,它都会将缓冲区冲到管道中,然后我的阅读器将其拾起。解决方案是将“0”作为附加参数添加到“open”命令(PipeOut=open(PipeName'w',0)而不是PipeOut=open(PipeName,'w'),从而将缓冲区大小设置为零。现在,当我“写”到管道中时,数据直接进入管道,直到被冲洗干净后才会被搁置。在
相关问题 更多 >
编程相关推荐