123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115 |
- //
- // Created by huli on 2020/9/25.
- //
- #ifndef NNXX_TESTS_SNAP7_E_BASE_H
- #define NNXX_TESTS_SNAP7_E_BASE_H
- #include <s7_client.h>
- #include <mutex>
- #include <map>
- #include "error_code/error_code.hpp"
- #include "thread/thread_condition.h"
- #include "snap7_buf.h"
- #include "s7_plc.h"
- #include "plcJsonConfig.h"
- class Snap7_communication_base {
- public:
- //snap7的通信延时, 默认50ms
- #define SNAP7_COMMUNICATION_DELAY_TIME_MS 10
- //snap7的通信参数路径
- #define SNAP7_COMMUNICATION_PARAMETER_PATH "../etc/snap7_communication.prototxt"
- //通信状态
- enum Snap7_communication_statu {
- SNAP7_COMMUNICATION_UNKNOWN = 0, //通信状态 未知
- SNAP7_COMMUNICATION_READY = 1, //通信状态 正常
- SNAP7_COMMUNICATION_RECEIVE = 2, //接受
- SNAP7_COMMUNICATION_SEND = 3, //发送
- SNAP7_COMMUNICATION_DISCONNECT = 4, //断连
- SNAP7_COMMUNICATION_FAULT = 10, //通信状态 错误
- };
- protected:
- Snap7_communication_base();
- Snap7_communication_base(const Snap7_communication_base &other) = default;
- Snap7_communication_base &operator=(const Snap7_communication_base &other) = default;
- ~Snap7_communication_base();
- public://API functions
- //初始化 通信 模块。如下二选一
- virtual Error_manager communication_init(std::string ip);
- //反初始化 通信 模块。
- virtual Error_manager communication_uninit();
- //唤醒s7通信线程
- virtual Error_manager communication_start();
- //停止s7通信线程
- virtual Error_manager communication_stop();
- //更新数据
- virtual Error_manager updata_receive_buf();
- virtual Error_manager updata_send_buf();
- public://get or set member variable
- Snap7_communication_statu get_status();
- protected://member functions
- //接受数据, 读取DB块,
- Error_manager read_data_buf(Snap7_buf &snap7_buf);
- //发送数据, 写入DB块,
- Error_manager write_data_buf(Snap7_buf &snap7_buf);
- //通信连接
- Error_manager communication_connect(std::string ip_string);
- //启动通信, run thread
- Error_manager communication_run();
- //通信断连
- Error_manager communication_disconnect();
- //mp_communication_thread线程的执行函数, 负责进行s7的通信
- void communication_thread();
- //数据颠倒
- Error_manager reverse_byte(void *p_buf_in, void *p_buf_out, int size);
- protected://member variable
- public:
- //状态
- Snap7_communication_statu m_communication_status; //通信状态
- std::string m_ip_string; //通信ip
- //通信模块
- std::mutex m_communication_lock; //通信锁
- TSnap7Client m_snap7_client; //通信的客户端
- int m_communication_delay_time_ms;//通信延时, 单位ms
- //注:s7协议通信很不稳定, 在每次使用 TSnap7Client 之后, 都需要加延时
- //数据
- std::mutex m_receive_buf_lock; //接受的锁
- std::map<int, Snap7_buf> m_receive_buf_map; //接受的map容器
- std::mutex m_send_buf_lock; //发送的锁
- std::map<int, Snap7_buf> m_send_buf_map; //发送的map容器
- //线程, snap7的通信核心就是对 发送和接受内存的 周期性读写, 所以使用一个线程即可.
- std::thread *mp_communication_thread; //通信的线程指针
- Thread_condition m_communication_condition; //通信的条件变量
- private:
- };
- #endif //NNXX_TESTS_SNAP7_E_BASE_H
|