Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.
 
 
 
 

212 rindas
5.0 KiB

  1. #include "ModbusRepository.h"
  2. #include <QByteArray>
  3. #include <QBuffer>
  4. #include <QDataStream>
  5. CModbusRepository::CModbusRepository()
  6. {
  7. }
  8. int CModbusRepository::AddHRDataMap(quint16 StartAddress, quint16 Length)
  9. {
  10. for(int i= 0; i < mHoldingRegisters.size(); i++)
  11. {
  12. if((StartAddress >= mHoldingRegisters.at(i).mStartAddress && StartAddress <= mHoldingRegisters.at(i).mEndAddress) ||
  13. (StartAddress + Length - 1 >= mHoldingRegisters.at(i).mStartAddress && StartAddress + Length - 1 <= mHoldingRegisters.at(i).mEndAddress))
  14. {
  15. return RET_ERROR; //The data map overlaps an existing map.
  16. }
  17. }
  18. CHRDataMap NewHRMap(StartAddress,Length);
  19. mHoldingRegisters.append(NewHRMap);
  20. qDebug("Created a new HR data map at address: %d with size %d",StartAddress,Length);
  21. return RET_OK;
  22. }
  23. bool CModbusRepository::IsHRValid(quint16 StartAddress, quint16 Length, int *index)
  24. {
  25. for(int i= 0; i < mHoldingRegisters.size(); i++)
  26. {
  27. if((StartAddress >= mHoldingRegisters.at(i).mStartAddress && StartAddress + Length - 1 <= mHoldingRegisters.at(i).mEndAddress))
  28. {
  29. if(index != 0)
  30. {
  31. *index = i;
  32. }
  33. return true;
  34. }
  35. }
  36. return false;
  37. }
  38. QByteArray CModbusRepository::GetHRData(quint16 StartAddress, quint16 Length, bool *OK)
  39. {
  40. QByteArray Data;
  41. int RegisterIndex = 0;
  42. if(IsHRValid(StartAddress,Length, &RegisterIndex) == false)
  43. {
  44. if(OK != 0)
  45. {
  46. *OK = false;
  47. }
  48. }
  49. else
  50. {
  51. int DataIndex = StartAddress - mHoldingRegisters.at(RegisterIndex).mStartAddress;
  52. for(int i = 0; i < Length; i++)
  53. {
  54. quint16 CurReg = mHoldingRegisters.at(RegisterIndex).mRegistersData.at(DataIndex++);
  55. quint8 HighByte, LowByte;
  56. LowByte = CurReg & 0x00FF;
  57. HighByte = (CurReg >> 8) & 0x00FF;
  58. Data.append(HighByte);
  59. Data.append(LowByte);
  60. }
  61. if(OK != 0)
  62. {
  63. *OK = true;
  64. }
  65. }
  66. return Data;
  67. }
  68. int CModbusRepository::WriteHRData(quint16 StartAddress, quint16 Length, QByteArray Data)
  69. {
  70. int RegisterIndex;
  71. if(IsHRValid(StartAddress,Length, &RegisterIndex) == false)
  72. {
  73. return RET_ERROR;
  74. }
  75. if(Length*2 != Data.size())
  76. {
  77. return RET_ERROR;
  78. }
  79. int DataIndex = StartAddress - mHoldingRegisters.at(RegisterIndex).mStartAddress;
  80. for(int i = 0; i < Length; i++)
  81. {
  82. quint8 HighByte = Data.at(i*2);
  83. quint8 LowByte = Data.at(i*2 + 1);
  84. qint16 Word = HighByte;
  85. Word <<= 8;
  86. Word += LowByte;
  87. Word = Word &0xFFFF;
  88. mHoldingRegisters[RegisterIndex].mRegistersData[DataIndex++] = Word;
  89. }
  90. return RET_OK;
  91. }
  92. int CModbusRepository::WriteSingleReg(quint16 Address, quint16 Value)
  93. {
  94. int RegisterIndex;
  95. if(IsHRValid(Address,1, &RegisterIndex) == false)
  96. {
  97. return RET_ERROR;
  98. }
  99. int DataIndex = Address - mHoldingRegisters.at(RegisterIndex).mStartAddress;
  100. mHoldingRegisters[RegisterIndex].mRegistersData[DataIndex] = Value;
  101. return RET_OK;
  102. }
  103. quint16 CModbusRepository::GetSingleReg(quint16 Address, bool *OK)
  104. {
  105. int RegisterIndex;
  106. if(IsHRValid(Address,1, &RegisterIndex) == false)
  107. {
  108. if(OK != 0)
  109. {
  110. *OK = false;
  111. }
  112. return 0;
  113. }
  114. if(OK != 0)
  115. {
  116. *OK = true;
  117. }
  118. int DataIndex = Address - mHoldingRegisters.at(RegisterIndex).mStartAddress;
  119. return mHoldingRegisters[RegisterIndex].mRegistersData[DataIndex];
  120. }
  121. QList<qint16> CModbusRepository::GetRegs(quint16 StartAddress, quint16 Length, bool *OK)
  122. {
  123. int RegisterIndex;
  124. if(IsHRValid(StartAddress,Length, &RegisterIndex) == false)
  125. {
  126. if(OK != 0)
  127. {
  128. *OK = false;
  129. }
  130. return QList<qint16>();
  131. }
  132. if(OK != 0)
  133. {
  134. *OK = true;
  135. }
  136. int DataIndex = StartAddress - mHoldingRegisters.at(RegisterIndex).mStartAddress;
  137. return mHoldingRegisters[RegisterIndex].mRegistersData.mid(DataIndex,Length);
  138. }
  139. CHRDataMap::CHRDataMap(quint16 StartAddress, quint16 Length)
  140. {
  141. mStartAddress = StartAddress;
  142. mLength = Length;
  143. for(int i = 0; i < Length; i++)
  144. {
  145. mRegistersData.append(0);
  146. }
  147. /*
  148. mRegistersData[0] = 0x1234;
  149. mRegistersData[1] = 0x4567;
  150. mRegistersData[2] = 0x8911;
  151. mRegistersData[3] = 9873;
  152. mRegistersData[4] = 0xABCD;*/
  153. mEndAddress = StartAddress + Length - 1;
  154. }
  155. int CModbusRepository::WriteMultipleRegs(quint16 StartAddress, QList<qint16> Data)
  156. {
  157. int RegisterIndex;
  158. if(IsHRValid(StartAddress,Data.size(), &RegisterIndex) == false)
  159. {
  160. return RET_ERROR;
  161. }
  162. //mMutex.lockForWrite();
  163. int DataIndex = StartAddress - mHoldingRegisters.at(RegisterIndex).mStartAddress;
  164. for(int i = 0; i < Data.size(); i++)
  165. {
  166. mHoldingRegisters[RegisterIndex].mRegistersData[DataIndex++] = Data.at(i);
  167. }
  168. // mMutex.unlock();
  169. // emit RepoChanged(StartAddress,Data.size());
  170. return RET_OK;
  171. }