選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。
 
 
 
 
 
 

85 行
3.6 KiB

  1. #include "modbus_data_store.h"
  2. #include "plsr_modbus_data.h"
  3. #include <stdint.h>
  4. #include <stdio.h>
  5. static unsigned TestChecks;
  6. #define CHECK(condition) \
  7. do \
  8. { \
  9. TestChecks++; \
  10. if (!(condition)) \
  11. { \
  12. (void)printf("FAIL line %d: %s\n", __LINE__, #condition); \
  13. return 1; \
  14. } \
  15. } while (0)
  16. int main(void)
  17. {
  18. PLSR_DATA_SOURCE source;
  19. uint16_t words[4] = {0x5678U, 0x1234U, 0xFFFEU, 0xFFFFU};
  20. uint16_t word;
  21. int32_t dword;
  22. uint32_t sequence;
  23. CHECK(ModbusDataValidateWords(MODBUS_DATA_DEVICE_D, 0UL, 1UL) == 1U);
  24. CHECK(ModbusDataValidateWords(MODBUS_DATA_DEVICE_HD, 9998UL, 2UL) == 1U);
  25. CHECK(ModbusDataValidateWords(MODBUS_DATA_DEVICE_FD, 9999UL, 2UL) == 0U);
  26. CHECK(ModbusDataValidateWords(MODBUS_DATA_DEVICE_D, 0UL, 0UL) == 0U);
  27. CHECK(ModbusDataValidateWords((MODBUS_DATA_DEVICE)3, 0UL, 1UL) == 0U);
  28. sequence = ModbusDataGetWriteSequence();
  29. CHECK((sequence & 1UL) == 0UL);
  30. CHECK(ModbusDataWriteWords(MODBUS_DATA_DEVICE_D, 1000UL, words, 4UL)
  31. == 1U);
  32. CHECK(ModbusDataGetWriteSequence() == sequence + 2UL);
  33. CHECK(ModbusDataReadDword(MODBUS_DATA_DEVICE_D, 1000UL, &dword) == 1U);
  34. CHECK(dword == (int32_t)0x12345678UL);
  35. CHECK(ModbusDataReadDword(MODBUS_DATA_DEVICE_D, 1002UL, &dword) == 1U);
  36. CHECK(dword == -2);
  37. CHECK(ModbusDataWriteWord(MODBUS_DATA_DEVICE_HD, 5UL, 0xA55AU) == 1U);
  38. CHECK(ModbusDataWriteWord(MODBUS_DATA_DEVICE_FD, 5UL, 0x5AA5U) == 1U);
  39. CHECK(ModbusDataReadWord(MODBUS_DATA_DEVICE_D, 5UL, &word) == 1U);
  40. CHECK(word == 0U);
  41. CHECK(ModbusDataReadWord(MODBUS_DATA_DEVICE_HD, 5UL, &word) == 1U);
  42. CHECK(word == 0xA55AU);
  43. CHECK(ModbusDataReadWord(MODBUS_DATA_DEVICE_FD, 5UL, &word) == 1U);
  44. CHECK(word == 0x5AA5U);
  45. CHECK(ModbusDataReadLinear(10005UL, &word) == 1U);
  46. CHECK(word == 0xA55AU);
  47. CHECK(ModbusDataReadLinear(40005UL, &word) == 1U);
  48. CHECK(word == 0x5AA5U);
  49. CHECK(ModbusDataReadLinear(20000UL, &word) == 0U);
  50. CHECK(ModbusDataReadLinear(39999UL, &word) == 0U);
  51. CHECK(ModbusDataReadLinear(69999UL, &word) == 0U);
  52. PlsrModbusDataSourceInit(&source);
  53. CHECK(source.context == NULL);
  54. CHECK(source.validateWords != NULL);
  55. CHECK(source.readWord != NULL);
  56. CHECK(source.readDword != NULL);
  57. CHECK(source.readBit == NULL);
  58. CHECK(source.validateWords(source.context, PLSR_DEVICE_D, 1000UL, 4UL)
  59. == 1U);
  60. CHECK(source.validateWords(source.context, PLSR_DEVICE_X, 0UL, 1UL)
  61. == 0U);
  62. CHECK(source.readDword(source.context,
  63. PLSR_DEVICE_D,
  64. 1000UL,
  65. &dword) == 1U);
  66. CHECK(dword == (int32_t)0x12345678UL);
  67. CHECK(source.readWord(source.context, PLSR_DEVICE_HD, 5UL, &word) == 1U);
  68. CHECK(word == 0xA55AU);
  69. CHECK(source.readWord(source.context, PLSR_DEVICE_FD, 5UL, &word) == 1U);
  70. CHECK(word == 0x5AA5U);
  71. CHECK(source.readWord(source.context, PLSR_DEVICE_M, 5UL, &word) == 0U);
  72. PlsrModbusDataSourceInit(NULL);
  73. (void)printf("PASS: %u Modbus data-source checks\n", TestChecks);
  74. return 0;
  75. }