etisserant@203: #!/usr/bin/env python etisserant@203: # -*- coding: utf-8 -*- etisserant@203: etisserant@203: #This file is part of Beremiz, a Integrated Development Environment for etisserant@203: #programming IEC 61131-3 automates supporting plcopen standard and CanFestival. etisserant@203: # etisserant@203: #Copyright (C) 2007: Edouard TISSERANT and Laurent BESSARD etisserant@203: # etisserant@203: #See COPYING file for copyrights details. etisserant@203: # etisserant@203: #This library is free software; you can redistribute it and/or etisserant@203: #modify it under the terms of the GNU General Public etisserant@203: #License as published by the Free Software Foundation; either etisserant@203: #version 2.1 of the License, or (at your option) any later version. etisserant@203: # etisserant@203: #This library is distributed in the hope that it will be useful, etisserant@203: #but WITHOUT ANY WARRANTY; without even the implied warranty of etisserant@203: #MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU etisserant@203: #General Public License for more details. etisserant@203: # etisserant@203: #You should have received a copy of the GNU General Public etisserant@203: #License along with this library; if not, write to the Free Software etisserant@203: #Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA etisserant@203: etisserant@203: import os, sys, getopt, socket etisserant@203: etisserant@203: def usage(): etisserant@203: print "\nUsage of Beremiz PLC execution service :" etisserant@203: print "\n %s [PLC path]\n"%sys.argv[0] etisserant@203: etisserant@203: try: etisserant@203: opts, args = getopt.getopt(sys.argv[1:], "h", ["help"]) etisserant@203: except getopt.GetoptError: etisserant@203: # print help information and exit: etisserant@203: usage() etisserant@203: sys.exit(2) etisserant@203: etisserant@203: for o, a in opts: etisserant@203: if o in ("-h", "--help"): etisserant@203: usage() etisserant@203: sys.exit() etisserant@203: etisserant@203: if len(args) > 1: etisserant@203: usage() etisserant@203: sys.exit() etisserant@203: elif len(args) == 1: etisserant@203: WorkingDir = args[0] etisserant@203: elif len(args) == 0: etisserant@203: WorkingDir = os.getcwd() etisserant@203: else: etisserant@203: usage() etisserant@203: sys.exit() etisserant@203: etisserant@203: from runtime import PLCObject, ServicePublisher etisserant@203: import Pyro.core as pyro etisserant@203: etisserant@203: if not os.path.isdir(WorkingDir): etisserant@203: os.mkdir(WorkingDir) etisserant@203: etisserant@203: # type: fully qualified service type name etisserant@203: type = '_PYRO._tcp.local.' etisserant@203: # name: fully qualified service name etisserant@203: name = 'First test.%s'%(type) etisserant@203: # address: IP address as unsigned short, network byte order etisserant@203: etisserant@203: def gethostaddr(dst = '224.0.1.41'): etisserant@203: s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) etisserant@203: try: etisserant@203: s.connect((dst, 7)) etisserant@203: (host, port) = s.getsockname() etisserant@203: s.close() etisserant@203: if host != '0.0.0.0': etisserant@203: return host etisserant@203: except error: etisserant@203: pass etisserant@203: return socket.gethostbyname(socket.gethostname()) etisserant@203: etisserant@203: ip = gethostaddr() etisserant@203: # port: port that the service runs on etisserant@203: port = 3000 etisserant@203: # properties: dictionary of properties (or a string holding the bytes for the text field) etisserant@203: serviceproperties = {'description':'Remote control for PLC'} etisserant@203: etisserant@203: pyro.initServer() etisserant@203: daemon=pyro.Daemon(host=ip, port=port) etisserant@203: uri = daemon.connect(PLCObject(WorkingDir, daemon),"PLCObject") etisserant@203: print "The daemon runs on port :",daemon.port etisserant@203: print "The object's uri is :",uri etisserant@203: print "The working directory :",WorkingDir etisserant@203: print "Publish service on local network" etisserant@203: etisserant@203: ip_32b = socket.inet_aton(ip) etisserant@203: # Configure and publish service etisserant@203: service = ServicePublisher.PublishService() etisserant@203: service.ConfigureService(type, name, ip_32b, port, serviceproperties) etisserant@203: service.PublishService() etisserant@203: etisserant@203: daemon.requestLoop()