s7_plc.cpp 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. #include "s7_plc.h"
  2. S7PLC::S7PLC():bConnected_(false)
  3. {
  4. }
  5. S7PLC::~S7PLC()
  6. {
  7. std::cout<<"plc start delete"<<std::endl;
  8. disconnect();
  9. std::cout<<"plc finish delete"<<std::endl;
  10. }
  11. bool S7PLC::getConnection(){
  12. return bConnected_;
  13. }
  14. bool S7PLC::connect(std::string ip)
  15. {
  16. std::lock_guard<std::mutex> lck (mutex_);
  17. int ret=client_.ConnectTo(ip.c_str(),0,1);
  18. bConnected_=(ret==0);
  19. return bConnected_;
  20. }
  21. bool S7PLC::ReadShorts(int DBNumber,int start,int size,short* pdata)
  22. {
  23. short* plc_data= (short*)malloc(size*sizeof(short));
  24. bool ret=read_dbs(DBNumber,start*sizeof(short),size*sizeof(short),pdata);
  25. if(ret)
  26. {
  27. reverse_byte(pdata,size*sizeof(short),plc_data);
  28. for(int i=0;i<size;++i)
  29. pdata[i]=plc_data[size-i-1];
  30. }
  31. free(plc_data);
  32. return ret;
  33. }
  34. bool S7PLC::WriteShorts(int DBNumber,int start,int size,short* pdata)
  35. {
  36. short* plc_data=(short*)malloc(size*sizeof(short));
  37. memcpy(plc_data,pdata,size*sizeof(short));
  38. for(int i=0;i<size;++i)
  39. plc_data[i]=HTON(plc_data[i]);
  40. bool ret=write_dbs(DBNumber,start*sizeof(short),size*sizeof(short),plc_data);
  41. free(plc_data);
  42. return ret;
  43. }
  44. bool S7PLC::read_dbs(int DBNumber,int start,int size,void* pdata)
  45. {
  46. std::lock_guard<std::mutex> lck (mutex_);
  47. usleep(1000* 50);
  48. if(bConnected_==false)
  49. return false;
  50. int ret=client_.AsDBRead(DBNumber,start,size,pdata);
  51. return ret == 0;
  52. }
  53. bool S7PLC::write_dbs(int DBNumber, int start, int size, void *pdata)
  54. {
  55. std::lock_guard<std::mutex> lck(mutex_);
  56. usleep(1000*50);
  57. if(bConnected_==false)
  58. return false;
  59. int ret = client_.AsDBWrite(DBNumber, start, size, pdata);
  60. return ret == 0;
  61. }
  62. void S7PLC::disconnect()
  63. {
  64. std::lock_guard<std::mutex> lck(mutex_);
  65. client_.Disconnect();
  66. }
  67. void S7PLC::reverse_byte(void* pdata,int num_byte,void* out)
  68. {
  69. char* pin=(char*)pdata;
  70. char* pout=(char*)out;
  71. for(int i=0;i<num_byte;++i)
  72. {
  73. pout[i]=pin[num_byte-i-1];
  74. }
  75. }