综合平台编程器项目的远程存储
Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 
 
 

131 lignes
3.8 KiB

  1. #pragma once
  2. #include "domain/register_address.h"
  3. #include "domain/project_limits.h"
  4. #include <algorithm>
  5. #include <cctype>
  6. #include <functional>
  7. #include <string>
  8. #include <vector>
  9. struct PlcSerialConfiguration
  10. {
  11. std::string portName;
  12. int serverAddress = 1;
  13. int baudRate = 9600;
  14. int dataBits = 8;
  15. int parity = 2;
  16. int stopBits = 1;
  17. int responseTimeoutMs = 1000;
  18. int retries = 2;
  19. int pollIntervalMs = 200;
  20. };
  21. enum class PlcConnectionState
  22. {
  23. Disconnected,
  24. Connecting,
  25. Connected,
  26. Recovering,
  27. Faulted
  28. };
  29. enum class PlcCommunicationError
  30. {
  31. None,
  32. SerialPortOpenFailed,
  33. PlcNotResponding,
  34. UsbSerialAdapterRemoved,
  35. SerialConnectionLost,
  36. CommunicationTimeout,
  37. ProtocolError,
  38. ReadFailed,
  39. WriteFailed,
  40. ConfigurationError,
  41. RequestAborted,
  42. Unknown
  43. };
  44. struct PlcCommunicationResult
  45. {
  46. bool succeeded = false;
  47. std::string message;
  48. };
  49. inline PlcCommunicationResult validatePlcSerialConfiguration(
  50. const PlcSerialConfiguration &configuration)
  51. {
  52. const bool has_port_name = std::any_of(
  53. configuration.portName.cbegin(), configuration.portName.cend(),
  54. [](unsigned char character) { return std::isspace(character) == 0; });
  55. if (!has_port_name)
  56. {
  57. return {false, "必须填写串口端口"};
  58. }
  59. if (configuration.serverAddress < ProjectLimits::kMinimumPlcServerAddress
  60. || configuration.serverAddress > ProjectLimits::kMaximumPlcServerAddress)
  61. {
  62. return {false, "PLC 站号必须在 1~247 范围内"};
  63. }
  64. if (configuration.baudRate != 9600
  65. && configuration.baudRate != 19200
  66. && configuration.baudRate != 38400
  67. && configuration.baudRate != 57600
  68. && configuration.baudRate != 115200)
  69. {
  70. return {false, "波特率只支持 9600、19200、38400、57600 或 115200"};
  71. }
  72. if (configuration.dataBits != 7 && configuration.dataBits != 8)
  73. {
  74. return {false, "数据位只支持 7 或 8"};
  75. }
  76. if (configuration.parity != 0
  77. && configuration.parity != 2
  78. && configuration.parity != 3)
  79. {
  80. return {false, "校验方式只支持无校验、偶校验或奇校验"};
  81. }
  82. if (configuration.stopBits != 1 && configuration.stopBits != 2)
  83. {
  84. return {false, "停止位只支持 1 或 2"};
  85. }
  86. if (configuration.responseTimeoutMs < ProjectLimits::kMinimumResponseTimeoutMs
  87. || configuration.responseTimeoutMs > ProjectLimits::kMaximumResponseTimeoutMs)
  88. {
  89. return {false, "PLC 响应超时必须在 100~30000 ms 范围内"};
  90. }
  91. if (configuration.retries < ProjectLimits::kMinimumRetries
  92. || configuration.retries > ProjectLimits::kMaximumRetries)
  93. {
  94. return {false, "PLC 失败重试次数必须在 0~5 范围内"};
  95. }
  96. if (configuration.pollIntervalMs < ProjectLimits::kMinimumPollIntervalMs
  97. || configuration.pollIntervalMs > ProjectLimits::kMaximumPollIntervalMs)
  98. {
  99. return {false, "PLC 轮询周期必须在 50~10000 ms 范围内"};
  100. }
  101. return {true, {}};
  102. }
  103. class PlcCommunicationGateway
  104. {
  105. public:
  106. virtual ~PlcCommunicationGateway() = default;
  107. virtual PlcCommunicationResult connectDevice(
  108. const PlcSerialConfiguration &configuration) = 0;
  109. virtual void disconnectDevice() = 0;
  110. virtual PlcCommunicationResult setPollAddresses(
  111. const std::vector<RegisterAddress> &addresses) = 0;
  112. virtual PlcConnectionState state() const = 0;
  113. virtual bool initialReadCompleted() const = 0;
  114. virtual PlcCommunicationError lastErrorType() const = 0;
  115. virtual const std::string &lastError() const = 0;
  116. virtual void setCallbacks(
  117. std::function<void()> state_changed,
  118. std::function<void(bool)> initial_read_changed,
  119. std::function<void()> cache_updated,
  120. std::function<void(const std::string &)> error_reported) = 0;
  121. };