2015-11-22 4 views
2

Я прежде всего программист ПЛК, которому было поручено написать некоторый код для запуска на Raspberry Pi2B (Raspbian Wheezy), чтобы захватить некоторые данные из другого процесса, запущенного на RPi, и сделать эти данные доступными на Modbus TCP (старый PLC-протокол). У меня есть работа, но теперь я пытаюсь ее устранить. Я выбрал Named Pipes для IPC, и в этом мой вопрос. В моем примере кода Python (v2.7), если я запустил свой читатель, он открывается и переходит к команде readline и блокируется, как ожидалось. Когда я иду и запускаю своего писателя и выбираю открывать, писать и закрывать трубу, он делает так, как ожидалось, и записывает запись в трубу. Читатель, однако, просто сидит там, блокируя команду readline. Когда автор зацикливается и спрашивает, нужно ли открывать трубу или нет, если я выберу «y», мой читатель выплюнет запись, записанную в предыдущем цикле. Я рад, что получил свои данные, но не понимаю, почему «открытие» трубы в писателе заставляет читателя захватывать данные в это время. Я бы подумал, что увижу прочитанные данные после того, как мой писатель написал запись. Кроме того, я думаю, что «закрытие» канала в коде Writer ничего не делает, потому что я могу открыть канал в первый раз через логику, записать запись, а затем на следующем проходе через логику я могу выбрать не чтобы открыть трубку и все еще успешно записать ее.Python Named Pipes Behavior

  1. Что мне здесь не хватает? (риторический, вид)
  2. Каков правильный способ записи в именованную трубу в цикле?
  3. Почему читатель берет запись только после того, как Writer «открывает» трубу (независимо от того, был ли он открытым или нет с предыдущего прохода через петлю)?

Заранее благодарим за меня и будьте добры ко мне ... Помните, что я просто старый программист ПЛК, который был вынужден в Python-World!

Автор:

#!/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 

Читатель:

#!/usr/bin/env python 
import logging 
logging.basicConfig(format='%(asctime)s %(message)s') #,filename='DocTestLog') 
log = logging.getLogger() 
log.setLevel(logging.DEBUG) 
log.debug('Logging has started') 
log.debug('Modbus Server started.') 

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') 

log.debug('Open pipe for reading') 
PipeIn = open(PipeName, 'r') 
log.debug('Pipe is open for reading') 

while True: 
    #raw_input('Press any key to read pipe') 
    log.debug('Reading Line') 
    try: 
     PipeString = PipeIn.readline() [:-1] 
    except: 
     print 'Nothing there' 
    #PipeString = PipeIn.read() 
    log.debug('PipeString = '+PipeString) 

ответ

1

После долгих головы царапин, обыскивая Интернет, и методом проб и ошибок, у меня есть ответ. Суть проблемы заключалась в том, что когда я открывал трубку для записи, я не указывал аргумент «буферизации». Это заставило мою трубку писать кэшироваться где-то в буфере, а не сразу записываться в трубку. Всякий раз, когда я «открывал» свою трубу записи, он продувал буфер до трубы, и мой читатель затем поднял его. Решение заключалось в том, чтобы добавить «, 0» в качестве дополнительного аргумента в мою «открытую» команду (PipeOut = open (PipeName, 'w', 0) вместо PipeOut = open (PipeName, 'w')), тем самым устанавливая буфер размер до нуля. Теперь, когда я «пишу» в трубу, данные поступают непосредственно в трубу и не сидят в подвешенном состоянии до тех пор, пока не покраснеют.

Смежные вопросы