PdoMappingExample.cs 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159
  1. using System;
  2. using CCDCount.DLL.CanBus;
  3. namespace CanTest
  4. {
  5. /// <summary>
  6. /// PDO映射配置示例
  7. /// 演示如何配置TPDO和RPDO的数据映射
  8. /// </summary>
  9. public class PdoMappingExample
  10. {
  11. /// <summary>
  12. /// 示例1:配置TPDO1映射(从站→PLC)
  13. /// 将数字输入和模拟输入映射到TPDO1
  14. /// </summary>
  15. public static void Example1_ConfigureTpdoMapping(CanOpenSlave slave)
  16. {
  17. Console.WriteLine("=== 示例1: 配置TPDO1映射 ===\n");
  18. // TPDO1映射配置:
  19. // 条目1: 0x6000:01 (Digital Input Bit 0) - 8位
  20. // 条目2: 0x6400:01 (Analog Input Ch1) - 16位
  21. ushort mappingIndex = 0x1A00; // TPDO1映射参数
  22. // 设置映射条目数量
  23. slave.SetObjectValue(mappingIndex, 0x00, (byte)2);
  24. // 配置第1个映射项:0x6000:01, 8位
  25. // 格式:[索引(16位)][子索引(8位)][位数(8位)]
  26. uint mapping1 = (0x6000U << 16) | (0x01U << 8) | 0x08U;
  27. slave.SetObjectValue(mappingIndex, 0x01, mapping1);
  28. // 配置第2个映射项:0x6400:01, 16位
  29. uint mapping2 = (0x6400U << 16) | (0x01U << 8) | 0x10U;
  30. slave.SetObjectValue(mappingIndex, 0x02, mapping2);
  31. Console.WriteLine("TPDO1映射配置完成:");
  32. Console.WriteLine(" - 0x6000:01 (Digital Input) - 8位");
  33. Console.WriteLine(" - 0x6400:01 (Analog Input Ch1) - 16位");
  34. Console.WriteLine(" TPDO1总长度: 3字节\n");
  35. }
  36. /// <summary>
  37. /// 示例2:配置RPDO1映射(PLC→从站)
  38. /// 将数字输出和模拟输出映射到RPDO1
  39. /// </summary>
  40. public static void Example2_ConfigureRpdoMapping(CanOpenSlave slave)
  41. {
  42. Console.WriteLine("=== 示例2: 配置RPDO1映射 ===\n");
  43. // RPDO1映射配置:
  44. // 条目1: 0x6200:01 (Digital Output Bit 0) - 8位
  45. // 条目2: 0x6410:01 (Analog Output Ch1) - 16位
  46. ushort mappingIndex = 0x1600; // RPDO1映射参数
  47. // 设置映射条目数量
  48. slave.SetObjectValue(mappingIndex, 0x00, (byte)2);
  49. // 配置第1个映射项:0x6200:01, 8位
  50. uint mapping1 = (0x6200U << 16) | (0x01U << 8) | 0x08U;
  51. slave.SetObjectValue(mappingIndex, 0x01, mapping1);
  52. // 配置第2个映射项:0x6410:01, 16位
  53. uint mapping2 = (0x6410U << 16) | (0x01U << 8) | 0x10U;
  54. slave.SetObjectValue(mappingIndex, 0x02, mapping2);
  55. Console.WriteLine("RPDO1映射配置完成:");
  56. Console.WriteLine(" - 0x6200:01 (Digital Output) - 8位");
  57. Console.WriteLine(" - 0x6410:01 (Analog Output Ch1) - 16位");
  58. Console.WriteLine(" RPDO1总长度: 3字节\n");
  59. }
  60. /// <summary>
  61. /// 示例3:配置多个TPDO
  62. /// </summary>
  63. public static void Example3_MultipleTpdoConfiguration(CanOpenSlave slave)
  64. {
  65. Console.WriteLine("=== 示例3: 配置多个TPDO ===\n");
  66. // TPDO1: 数字输入 (事件驱动)
  67. ConfigureTpdo(slave, 1, 0x1A00, new uint[] {
  68. (0x6000U << 16) | (0x01U << 8) | 0x08U, // Digital Input Bit 0
  69. (0x6000U << 16) | (0x02U << 8) | 0x08U, // Digital Input Bit 1
  70. }, transmissionType: 0xFF);
  71. // TPDO2: 模拟输入 (SYNC同步,每10个SYNC发送)
  72. ConfigureTpdo(slave, 2, 0x1A01, new uint[] {
  73. (0x6400U << 16) | (0x01U << 8) | 0x10U, // Analog Input Ch1
  74. (0x6400U << 16) | (0x02U << 8) | 0x10U, // Analog Input Ch2
  75. }, transmissionType: 10);
  76. Console.WriteLine("多TPDO配置完成\n");
  77. }
  78. /// <summary>
  79. /// 辅助方法:配置TPDO
  80. /// </summary>
  81. private static void ConfigureTpdo(CanOpenSlave slave, byte pdoNumber,
  82. ushort mappingIndex, uint[] mappings, byte transmissionType = 0xFF)
  83. {
  84. // 启用TPDO
  85. slave.ConfigureTpdo(pdoNumber, true, transmissionType);
  86. // 设置映射条目数量
  87. slave.SetObjectValue(mappingIndex, 0x00, (byte)mappings.Length);
  88. // 配置每个映射项
  89. for (int i = 0; i < mappings.Length; i++)
  90. {
  91. slave.SetObjectValue(mappingIndex, (byte)(i + 1), mappings[i]);
  92. }
  93. Console.WriteLine($"TPDO{pdoNumber}已配置 ({mappings.Length}个映射项, 传输类型:{transmissionType})");
  94. }
  95. /// <summary>
  96. /// 完整配置示例
  97. /// </summary>
  98. public static void RunFullExample()
  99. {
  100. Console.WriteLine("========================================");
  101. Console.WriteLine(" CANopen从站 PDO映射完整配置示例");
  102. Console.WriteLine("========================================\n");
  103. byte nodeId = 5;
  104. using (CanOpenSlave slave = new CanOpenSlave(nodeId))
  105. {
  106. // 初始化
  107. if (!slave.Initialize(CanBaudRate.BaudRate_500K))
  108. {
  109. Console.WriteLine("初始化失败");
  110. return;
  111. }
  112. // 配置PDO映射
  113. Example1_ConfigureTpdoMapping(slave);
  114. Example2_ConfigureRpdoMapping(slave);
  115. Example3_MultipleTpdoConfiguration(slave);
  116. // 设置心跳
  117. slave.SetHeartbeatTime(1000);
  118. // 生成EDS文件
  119. slave.GenerateEdsFile($"Node{nodeId}_Configured.eds");
  120. // 启动从站
  121. slave.Start();
  122. Console.WriteLine("\n从站已启动,等待PLC连接...");
  123. Console.WriteLine("按任意键退出...\n");
  124. Console.ReadKey();
  125. slave.Stop();
  126. }
  127. }
  128. }
  129. }