Lydia - Printhead
OmronVFD.cpp
Go to the documentation of this file.
1 #include "./config.h"
2 #include "./enums.h"
3 #include <Bridge.h>
4 
5 #ifdef MB_MONITORING_STATUS_VFD_MAX_LOAD
6 #include <xstatistics.h>
7 #endif
8 
9 #ifdef MOTOR_LOAD_PIN
10 #include "./components/MotorLoad.h"
11 #endif
12 
13 #if (defined(MB_ANALOG_3POS_SWITCH_0) && defined(MB_ANALOG_3POS_SWITCH_1) || defined(MB_ANALOG_3POS_SWITCH_3))
15 #endif
16 
17 #if defined(MB_ANALOG_0) || defined(MB_ANALOG_1) || defined(MB_ANALOG_2)
18 #include "./components/POT.h"
19 #endif
20 
21 #include "OmronVFD.h"
22 #include "ModbusBridge.h"
23 #include "./OmronMX2.h"
24 #include "PHApp.h"
25 
26 #define valA001 3 // A001 Frequency reference source = 03 (no need to change)
27 #define valA002 3 // A002 Source of the “Move” command = 03 (no need to change)
28 #define valC026 5 // C026 Relay output function 5 (AL: error signal) = 05
29 
31 {
32 
33 #ifdef COOLING_RELAY
34  digitalWrite(COOLING_RELAY, HIGH);
35 #endif
36 #ifdef COOLING_RELAY2
37  digitalWrite(COOLING_RELAY2, HIGH);
38 #endif
39 #ifdef FEEDSCREW_RELAY
40  digitalWrite(FEEDSCREW_RELAY, HIGH);
41 #endif
42 
43  //@todo : handle multi errors
44  owner->clearError();
45  owner->onRun();
46  runTS = millis();
47  return E_OK;
48 }
50 {
51 
52 #ifdef COOLING_RELAY
53  digitalWrite(COOLING_RELAY, 0);
54 #endif
55 #ifdef COOLING_RELAY2
56  digitalWrite(COOLING_RELAY2, 0);
57 #endif
58 #ifdef FEEDSCREW_RELAY
59  digitalWrite(FEEDSCREW_RELAY, 0);
60 #endif
61  // owner->clearError();
62  stopTS = millis();
63  return E_OK;
64 }
66 {
67  // A001 Frequency reference source = 03 = Modbus
69  // A002 Source of the RUN command = 03 = Modbus
71  // C026 Relay output function 5 (AL: error signal) = 05
73  // A004 setting the maximum frequency
75 }
76 uint16_t OmronVFD::stop()
77 {
78  onStop();
79  direction = E_VFD_DIR::E_VFD_DIR_NONE;
80  return write_Bit(MX2_START, 0);
81 }
82 uint16_t OmronVFD::run()
83 {
84  onStart();
85  return write_Bit(MX2_START, 1);
86 }
88 {
89  direction = E_VFD_DIR::E_VFD_DIR_REVERSE;
90  return write_Bit(MX2_SET_DIR, 1);
91 }
93 {
94  direction = E_VFD_DIR::E_VFD_DIR_FORWARD;
95  return write_Bit(MX2_SET_DIR, 0);
96 }
97 uint16_t OmronVFD::setTargetFreq(uint16_t freq)
98 {
99  return write_Single(MX2_TARGET_FR, clamp<int>(freq * 100, 0, OMRON_VFD_MAX_FREQ * 100));
100 }
102 {
103  onStop();
104  bootTS = millis();
105  return E_OK;
106 }
108 {
109  if (mode && mode->value == Pos3Analog::POS3_DIRECTION::UP)
110  {
111  if (dir && dir->value)
112  {
113  return dir->value;
114  }
115  }
116  return 0;
117 }
118 
119 bool ready = false;
121 {
122 
123  if (millis() - debugTS > OMRON_MX2_DEBUG_INTERVAL)
124  {
125  debugTS = now;
126  }
127 
128 #ifdef MOTOR_LOAD_PIN
129  if (motorLoad)
130  {
131  currentStats.add(abs(motorLoad->value));
132  states[0].max_current = currentStats.maximum();
134  {
135  stop();
136  return onError(E_VFD_OVERLOAD);
137  }
138  }
139 #endif
140  bool hasDirectMode = true;
141  if (hasDirectMode && runMode == E_VFD_RUN_MODE::E_VFD_RUN_MODE_STOP_RETRACT)
142  {
143  short state = states[0].state;
144  switch (retractState)
145  {
146 
147  case E_VFD_RETRACT_STATE::E_VFD_RETRACT_STATE_BRAKING:
148  {
149  if (state == OMRON_STATE_DECELERATING)
150  {
151  }
152  if (state == OMRON_STATE_STOPPED)
153  {
154  retractState = E_VFD_RETRACT_STATE::E_VFD_RETRACT_STATE_STOPPED;
155  }
156  break;
157  }
158  case E_VFD_RETRACT_STATE::E_VFD_RETRACT_STATE_STOPPED:
159  {
160  reverse();
161  run();
162  retractState = E_VFD_RETRACT_STATE::E_VFD_RETRACT_STATE_REVERSING;
163  reverseStartTS = millis();
164  break;
165  }
166  case E_VFD_RETRACT_STATE::E_VFD_RETRACT_STATE_REVERSING:
167  {
169  {
170  stop();
171  retractState = E_VFD_RETRACT_STATE::E_VFD_RETRACT_STATE_BRAKE_REVERSING;
172  }
173  break;
174  }
175  case E_VFD_RETRACT_STATE::E_VFD_RETRACT_STATE_BRAKE_REVERSING:
176  {
178  {
179  forward();
180  retractState = E_VFD_RETRACT_STATE::E_VFD_RETRACT_STATE_RETRACTED;
181  runMode == E_VFD_RUN_MODE::E_VFD_RUN_MODE_NONE;
182  }
183  break;
184  }
185  }
186  }
187 
188  /*
189  // left direct mode
190  if (mode && mode->last_switch && !mode->value)
191  {
192  mode->last_switch = mode->value;
193  if (lastError == E_VFD_OVERLOAD)
194  {
195  owner->clearError();
196  }
197  stop();
198  }*/
199  /*
200  // left direct mode
201  if (mode && mode->last_switch && !mode->value && dir && !dir->value && dir->last_switch)
202  {
203  mode->last_switch = mode->value;
204  dir->last_switch = dir->value;
205  if (lastError == E_VFD_OVERLOAD)
206  {
207  owner->clearError();
208  }
209  stop();
210  }*/
211 
212  // cancel retract
213  if (hasDirectMode && mode && mode->value && dir && dir->value)
214  {
215  runMode = E_VFD_RUN_MODE::E_VFD_RUN_MODE_NONE;
216  retractState = E_VFD_RETRACT_STATE::E_VFD_RETRACT_STATE_NONE;
217  }
218 
219  // direct mode : control panel
220  if (mode && mode->value == Pos3Analog::POS3_DIRECTION::UP)
221  {
222  // speed
224  {
226  int dstSpeed = (speed->value * 100 / (ANALOG_INPUT_MAX_LEVEL_0 / 100)) / (OMRON_VFD_MAX_FREQ);
227  setTargetFreq(abs(dstSpeed));
228  }
229 
230  // direction
231  if (dir && dir->last_switch != dir->value)
232  {
233 
234  dir->last_switch = dir->value;
235  switch (dir->value)
236  {
237  case Pos3Analog::POS3_DIRECTION::UP:
238  // Log.notice("VFD: direct %s\n", "forward");
239  forward();
240  run();
241  break;
242  case Pos3Analog::POS3_DIRECTION::DOWN:
243  // Log.notice("VFD: direct %s\n", "reverse");
244  reverse();
245  run();
246  break;
247  case Pos3Analog::POS3_DIRECTION::MIDDLE:
248  // Log.notice("VFD: direct %s\n", "stop");
249  stop();
250  break;
251  }
252  }
253  }
254 
255  modbusLoop();
256  return E_OK;
257 }
258 
260 {
261  //*stream << this->name << ":" << this->ok();
262  modbus->print();
263  return false;
264 }
266 {
267  //*stream << this->name << "\n\t : " SPACE("Pin:" << MOTOR_IDLE_PIN);
268  return false;
269 }
270 short OmronVFD::onRegisterMethods(Bridge *bridge)
271 {
272  // bridge->registerMemberFunction(id, this, C_STR("debug"), (ComponentFnPtr)&OmronVFD::debug);
273  return E_OK;
274 }
OmronVFD::write_Single
uint16_t write_Single(uint16_t cmd, unsigned int data)
Definition: OmronVFDModbus.cpp:305
ANALOG_INPUT_MAX_LEVEL_0
#define ANALOG_INPUT_MAX_LEVEL_0
Definition: config_adv.h:114
OmronVFD::directDirection
short directDirection()
Definition: OmronVFD.cpp:107
OmronVFD::runMode
E_VFD_RUN_MODE runMode
Definition: OmronVFD.h:226
OmronVFD::configure
uint16_t configure()
Definition: OmronVFD.cpp:65
POT::value
int value
Definition: POT.h:89
PHApp::clearError
short clearError()
Definition: PHApp.cpp:319
MX2_A001
#define MX2_A001
Definition: OmronMX2.h:78
OMRON_MX2_DEBUG_INTERVAL
#define OMRON_MX2_DEBUG_INTERVAL
Definition: config.h:111
MX2_A004
#define MX2_A004
Definition: OmronMX2.h:82
OmronVFD::run
uint16_t run()
Definition: OmronVFD.cpp:82
OmronVFD::stop
uint16_t stop()
Definition: OmronVFD.cpp:76
OmronVFD::stopTS
millis_t stopTS
Definition: OmronVFD.h:222
MotorLoad::value
short value
Definition: MotorLoad.h:128
OmronMX2.h
OmronVFD::direction
E_VFD_DIR direction
Definition: OmronVFD.h:207
OmronVFD::modbus
ModbusBridge * modbus
Definition: OmronVFD.h:210
OmronVFD::retractState
E_VFD_RETRACT_STATE retractState
Definition: OmronVFD.h:227
E_VFD_OVERLOAD
#define E_VFD_OVERLOAD
Definition: enums.h:27
OmronVFD::debug
short debug()
Definition: OmronVFD.cpp:259
ModbusBridge::print
void print()
Definition: ModbusBridge.cpp:273
MX2_C026
#define MX2_C026
Definition: OmronMX2.h:68
OmronVFD::modbusLoop
short modbusLoop()
Definition: OmronVFDModbus.cpp:54
OmronVFD::forward
uint16_t forward()
Definition: OmronVFD.cpp:92
OmronVFD::currentStats
Statistic currentStats
Definition: OmronVFD.h:199
OMRON_STATE_STOPPED
#define OMRON_STATE_STOPPED
Definition: enums.h:274
OmronVFD::setup
short setup()
Definition: OmronVFD.cpp:101
POT.h
OmronVFD::dir
Pos3Analog * dir
Definition: OmronVFD.h:197
OmronVFD::loop
short loop()
Definition: OmronVFD.cpp:120
Pos3Analog::value
int value
Definition: 3PosAnalog.h:73
OmronVFD::owner
PHApp * owner
Definition: OmronVFD.h:200
OmronVFDState::state
int16_t state
Definition: OmronVFD.h:65
ModbusBridge.h
MX2_START
#define MX2_START
Definition: OmronMX2.h:85
MotorLoad.h
OmronVFD::runTS
millis_t runTS
Definition: OmronVFD.h:223
OmronVFD::setTargetFreq
uint16_t setTargetFreq(uint16_t freq)
Definition: OmronVFD.cpp:97
MX2_TARGET_FR
#define MX2_TARGET_FR
Definition: OmronMX2.h:13
valA001
#define valA001
Definition: OmronVFD.cpp:26
OmronVFDState::max_current
int8_t max_current
Definition: OmronVFD.h:63
OmronVFD::onStop
short onStop()
Definition: OmronVFD.cpp:49
OmronVFD::debugTS
millis_t debugTS
Definition: OmronVFD.h:189
MOTOR_OVERLOAD_RANGE_MIN
#define MOTOR_OVERLOAD_RANGE_MIN
Definition: config_adv.h:60
MX2_SET_DIR
#define MX2_SET_DIR
Definition: OmronMX2.h:86
ready
bool ready
Definition: OmronVFD.cpp:119
MX2_A002
#define MX2_A002
Definition: OmronMX2.h:80
OmronVFD::info
short info()
Definition: OmronVFD.cpp:265
valA002
#define valA002
Definition: OmronVFD.cpp:27
OmronVFD::reverse
uint16_t reverse()
Definition: OmronVFD.cpp:87
OmronVFD::onError
short onError(short error)
Definition: OmronVFDModbus.cpp:145
VFD_RETRACT_REVERSE_DURATION
#define VFD_RETRACT_REVERSE_DURATION
Definition: config.h:116
OmronVFD::speed
POT * speed
Definition: OmronVFD.h:195
E_OK
#define E_OK
Definition: enums.h:11
OmronVFD::reverseStartTS
millis_t reverseStartTS
Definition: OmronVFD.h:224
OmronVFD.h
enums.h
OMRON_VFD_MAX_FREQ
#define OMRON_VFD_MAX_FREQ
Definition: config.h:115
OmronVFD::onRegisterMethods
short onRegisterMethods(Bridge *bridge)
Definition: OmronVFD.cpp:270
OMRON_STATE_DECELERATING
#define OMRON_STATE_DECELERATING
Definition: enums.h:272
config.h
OMRON_STATE_RUNNING
#define OMRON_STATE_RUNNING
Definition: enums.h:273
ANALOG_INPUT_MIN_DT_0
#define ANALOG_INPUT_MIN_DT_0
Definition: config_adv.h:120
PHApp.h
OmronVFD::bootTS
millis_t bootTS
Definition: OmronVFD.h:190
PHApp::onRun
short onRun(short code=0)
Definition: PHApp.cpp:272
Pos3Analog::last_switch
int last_switch
Definition: 3PosAnalog.h:72
OmronVFD::write_Bit
uint16_t write_Bit(uint16_t addr, int on)
Definition: OmronVFDModbus.cpp:341
valC026
#define valC026
Definition: OmronVFD.cpp:28
3PosAnalog.h
OmronVFD::mode
Pos3Analog * mode
Definition: OmronVFD.h:196
OmronVFD::states
OmronVFDState states[1]
Definition: OmronVFD.h:212
POT::last_value
int last_value
Definition: POT.h:90
OmronVFD::motorLoad
MotorLoad * motorLoad
Definition: OmronVFD.h:198
OmronVFD::onStart
short onStart()
Definition: OmronVFD.cpp:30