example_dummy.py 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #!/usr/bin/env python3
  2. #
  3. # Simple pyprofibus dummy example using dummy PHY.
  4. # This example can be run without any PB hardware.
  5. #
  6. import sys
  7. import pyprofibus, pyprofibus.phy_dummy
  8. from pyprofibus import DpTelegram_SetPrm_Req, monotonic_time
  9. master = None
  10. try:
  11. # Parse the config file.
  12. config = pyprofibus.PbConf.fromFile("example_dummy.conf")
  13. # Create a PHY (layer 1) interface object
  14. phy = config.makePhy()
  15. # Create a DP class 1 master with DP address 1
  16. master = pyprofibus.DPM1(phy = phy,
  17. masterAddr = config.dpMasterAddr,
  18. debug = True)
  19. # Create a slave descriptions.
  20. for slaveConf in config.slaveConfs:
  21. gsd = slaveConf.gsd
  22. slaveDesc = pyprofibus.DpSlaveDesc(
  23. identNumber = gsd.getIdentNumber(),
  24. slaveAddr = slaveConf.addr)
  25. # Create Chk_Cfg telegram elements
  26. slaveDesc.setCfgDataElements(gsd.getCfgDataElements())
  27. # Set User_Prm_Data
  28. dp1PrmMask = bytearray((DpTelegram_SetPrm_Req.DPV1PRM0_FAILSAFE,
  29. DpTelegram_SetPrm_Req.DPV1PRM1_REDCFG,
  30. 0x00))
  31. dp1PrmSet = bytearray((DpTelegram_SetPrm_Req.DPV1PRM0_FAILSAFE,
  32. DpTelegram_SetPrm_Req.DPV1PRM1_REDCFG,
  33. 0x00))
  34. slaveDesc.setUserPrmData(gsd.getUserPrmData(dp1PrmMask = dp1PrmMask,
  35. dp1PrmSet = dp1PrmSet))
  36. # Set various standard parameters
  37. slaveDesc.setSyncMode(slaveConf.syncMode)
  38. slaveDesc.setFreezeMode(slaveConf.freezeMode)
  39. slaveDesc.setGroupMask(slaveConf.groupMask)
  40. slaveDesc.setWatchdog(slaveConf.watchdogMs)
  41. # Register the slave at the DPM
  42. master.addSlave(slaveDesc)
  43. # Initialize the DPM
  44. master.initialize()
  45. slaveDescs = master.getSlaveList()
  46. # Run the slave state machine.
  47. slaveData = [ bytearray((0x42, 0x24,)) ] * len(slaveDescs)
  48. rtSum, runtimes, nextPrint = 0, [ 0, ] * 512, monotonic_time() + 1.0
  49. while True:
  50. start = monotonic_time()
  51. # Run slave state machines.
  52. for i, slaveDesc in enumerate(slaveDescs):
  53. inData = master.runSlave(slaveDesc, slaveData[i])
  54. if inData is not None:
  55. slaveData[i] = bytearray((inData[1], inData[0]))
  56. # Print statistics.
  57. end = monotonic_time()
  58. runtimes.append(end - start)
  59. rtSum = rtSum - runtimes.pop(0) + runtimes[-1]
  60. if end > nextPrint:
  61. nextPrint = end + 3.0
  62. sys.stderr.write("pyprofibus cycle time = %.3f ms\n" %\
  63. (rtSum / len(runtimes) * 1000.0))
  64. except pyprofibus.ProfibusError as e:
  65. print("Terminating: %s" % str(e))
  66. finally:
  67. if master:
  68. master.destroy()