Advertisement
Guest User

Untitled

a guest
Dec 11th, 2018
78
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 20.11 KB | None | 0 0
  1. /*
  2. * Gruppe E9 - DZE
  3. */
  4.  
  5. #include <rtai_mbx.h>
  6. #include <rtai_sched.h>
  7.  
  8. #include <uint128.h>
  9. #include <sys/rtai_modbus.h>
  10.  
  11. #define SETBIT(i) (1 << i)
  12. //Ausgänge
  13. #define AUSGANG_HAUPTBAND_ANHALTEN SETBIT(0)
  14. #define AUSGANG_HAUPTBAND_LANGSAMER SETBIT(1)
  15. #define AUSGANG_HAUPTBAND_AN_LINKS SETBIT(2)
  16. #define AUSGANG_HAUPTBAND_AN_RECHTS SETBIT(3)
  17. #define AUSGANG_MASSENMAGAZINBAND_AN SETBIT(4)
  18. #define AUSGANG_ZUBRINGERBAND_AN SETBIT(6)
  19. #define AUSGANG_VEREINZELER SETBIT(7)
  20. #define AUSGANG_AUSWURF_MASSENMAGAZIN SETBIT(8)
  21. #define AUSGANG_MAGAZIN1_EINFAHREN SETBIT(9)
  22. #define AUSGANG_MAGAZIN1_AUSFAHREN SETBIT(10)
  23. #define AUSGANG_MAGAZIN2_EINFAHREN SETBIT(11)
  24. #define AUSGANG_MAGAZIN2_AUSFAHREN SETBIT(12)
  25. #define AUSGANG_MAGAZIN3_EINFAHREN SETBIT(13)
  26. #define AUSGANG_MAGAZIN3_AUSFAHREN SETBIT(14)
  27. #define AUSGANG_AUSWERFER_RECHTS SETBIT(15)
  28. #define AUSGANG_AUSWERFER_LINKS SETBIT(16)
  29. #define AUSGANG_AUSWERFER_SPERRE_ENTFERNEN SETBIT(17)
  30. //Eingänge
  31. #define EINGANG_MASSENMAGAZINBAND_ENDE SETBIT(0)
  32. #define EINGANG_ZUBRINGERBAND_ENDE SETBIT(1)
  33. #define EINGANG_HAUPTBAND_ANFANG SETBIT(2)
  34. #define EINGANG_HAUPTBAND_ZW1U2 SETBIT(3)
  35. #define EINGANG_HAUPTBAND_ZW2U3 SETBIT(4)
  36. #define EINGANG_HAUPTBAND_VOR_WEICHE SETBIT(5)
  37. #define EINGANG_VEREINZELER_AUSGEFAHREN SETBIT(6)
  38. #define EINGANG_VEREINZELER_TEIL_DA SETBIT(7)
  39. #define EINGANG_AUSWURF_MASSENMAGAZIN_AUSGEFAHREN SETBIT(8)
  40. #define EINGANG_AUSWURF_MASSENMAGAZIN_TEIL_DA SETBIT(9)
  41. #define EINGANG_MAGAZIN1_EINGEFAHREN SETBIT(10)
  42. #define EINGANG_MAGAZIN1_AUSGEFAHREN SETBIT(11)
  43. #define EINGANG_MAGAZIN1_TEIL_DA SETBIT(12)
  44. #define EINGANG_MAGAZIN2_EINGEFAHREN SETBIT(13)
  45. #define EINGANG_MAGAZIN2_AUSGEFAHREN SETBIT(14)
  46. #define EINGANG_MAGAZIN2_TEIL_DA SETBIT(15)
  47. #define EINGANG_MAGAZIN3_EINGEFAHREN SETBIT(16)
  48. #define EINGANG_MAGAZIN3_AUSGEFAHREN SETBIT(17)
  49. #define EINGANG_MAGAZIN3_TEIL_DA SETBIT(18)
  50. #define EINGANG_AUSWERFER_RECHTS SETBIT(19)
  51. #define EINGANG_AUSWERFER_LINKS SETBIT(20)
  52. #define EINGANG_AUSWERFER_MITTE SETBIT(21) //evtl. sleep erforderlich, weil Sensor zu früh Volĺzug meldet
  53. #define EINGANG_AUSWERFER_SPERRE SETBIT(22)
  54. #define EINGANG_RUTSCHE_VOLL SETBIT(23)
  55. #define EINGANG_HOEHENSENSOR_VERDREHT SETBIT(24)
  56. #define EINGANG_HOEHENSENSOR_OK SETBIT(25)
  57.  
  58. MODULE_LICENSE("GPL");
  59.  
  60. static RT_TASK pruefercontrol_task;
  61. static RT_TASK vereinzeler_task;
  62. static RT_TASK magazin_task;
  63. static RT_TASK massenmagazin_task;
  64. static RT_TASK auswerfer_task;
  65. static RT_TASK rutsche_task;
  66.  
  67. static SEM hauptband_kreuzung_sem;
  68. static SEM modbus_sem;
  69. static SEM alles_anhalten_sem;
  70.  
  71. static MBX pruefer_an_auswerfer_mbx;
  72. static MBX auswerfer_an_rutsche_mbx;
  73. static MBX rutsche_an_auswerfer_mbx;
  74.  
  75. char hauptband_kreuzung_geblockt = 0;
  76. char massenmagazin_leer = 0;
  77. char alles_anhalten = 0;
  78.  
  79. int fd_node;
  80. int current_Modbus_Out;
  81. int readModbus(int in_or_out);
  82. int writeModbus(int in_or_out, int values);
  83. int isSet(int in_or_out, int wert);
  84. int set(int wert);
  85. int delete(int wert);
  86. int deleteAll(void);
  87. void magazinAuswerfen(int magazin);
  88. void pollKreuzung(void);
  89.  
  90.  
  91. int readModbus(int in_or_out) {
  92. unsigned short low;
  93. unsigned short high;
  94. if (rt_modbus_get(fd_node, in_or_out, 0, (unsigned short *) &low)) {
  95. rt_printk("failed reading modbus");
  96. }
  97. if (rt_modbus_get(fd_node, in_or_out, 1, (unsigned short *) &high)) {
  98. rt_printk("failed reading modbus");
  99. }
  100. return ((int) low | (int) (high << 16));
  101. }
  102.  
  103. int writeModbus(int in_or_out, int values) {
  104. int worked = 1;
  105. unsigned short low = values;
  106. unsigned short high = (values >> 16);
  107. if (rt_modbus_set(fd_node, in_or_out, 0, low)) {
  108. rt_printk("failed writing modbus");
  109. worked = 0;
  110. }
  111. if (rt_modbus_set(fd_node, in_or_out, 1, high)) {
  112. rt_printk("failed writing modbus");
  113. worked = 0;
  114. }
  115. return worked;
  116. }
  117.  
  118. int isSet(int in_or_out, int wert) {
  119. int currentStatus = readModbus(in_or_out);
  120. currentStatus = currentStatus & wert;
  121. return currentStatus;
  122. }
  123.  
  124. int set(int wert) {
  125. int result;
  126.  
  127. rt_sem_wait(&modbus_sem);
  128. current_Modbus_Out = current_Modbus_Out | wert;
  129. result = writeModbus(DIGITAL_OUT, current_Modbus_Out);
  130. rt_sem_signal(&modbus_sem);
  131.  
  132. return result;
  133. }
  134.  
  135. int delete(int wert) {
  136. int result;
  137.  
  138. rt_sem_wait(&modbus_sem);
  139. if(isSet(DIGITAL_OUT, wert)) {
  140. current_Modbus_Out = current_Modbus_Out ^ wert;
  141. result = writeModbus(DIGITAL_OUT, current_Modbus_Out);
  142. } else {
  143. result = 1;
  144. }
  145. rt_sem_signal(&modbus_sem);
  146.  
  147. return result;
  148. }
  149.  
  150. int deleteAll(void) {
  151. return writeModbus(DIGITAL_OUT, 0);
  152. }
  153.  
  154. void magazinAuswerfen(int magazin) {
  155. int ausfahren, einfahren, ausgefahren, eingefahren;
  156. if (magazin == 3) {
  157. ausfahren = AUSGANG_MAGAZIN3_AUSFAHREN;
  158. einfahren = AUSGANG_MAGAZIN3_EINFAHREN;
  159. ausgefahren = EINGANG_MAGAZIN3_AUSGEFAHREN;
  160. eingefahren = EINGANG_MAGAZIN3_EINGEFAHREN;
  161. }
  162. if (magazin == 2) {
  163. ausfahren = AUSGANG_MAGAZIN2_AUSFAHREN;
  164. einfahren = AUSGANG_MAGAZIN2_EINFAHREN;
  165. ausgefahren = EINGANG_MAGAZIN2_AUSGEFAHREN;
  166. eingefahren = EINGANG_MAGAZIN2_EINGEFAHREN;
  167. }
  168. if (magazin == 1) {
  169. ausfahren = AUSGANG_MAGAZIN1_AUSFAHREN;
  170. einfahren = AUSGANG_MAGAZIN1_EINFAHREN;
  171. ausgefahren = EINGANG_MAGAZIN1_AUSGEFAHREN;
  172. eingefahren = EINGANG_MAGAZIN1_EINGEFAHREN;
  173. }
  174. set(ausfahren);
  175. // Druck aufbauen
  176. rt_sleep(50 * nano2count(1000000));
  177. while (!isSet(DIGITAL_IN, ausgefahren)) {
  178. rt_sleep(50 * nano2count(1000000));
  179. }
  180. delete(ausfahren);
  181. rt_sleep(50 * nano2count(1000000));
  182. set(einfahren);
  183. rt_sleep(50 * nano2count(1000000));
  184. while (!isSet(DIGITAL_IN, eingefahren)) {
  185. rt_sleep(5 * nano2count(1000000));
  186. }
  187. delete(einfahren);
  188. rt_sleep(50 * nano2count(1000000));
  189. }
  190.  
  191. void pollKreuzung(void){
  192. char hauptband_kreuzung_polling;
  193. rt_sem_wait(&hauptband_kreuzung_sem);
  194. hauptband_kreuzung_polling = hauptband_kreuzung_geblockt;
  195. rt_sem_signal(&hauptband_kreuzung_sem);
  196.  
  197. if (hauptband_kreuzung_polling) {
  198. // Prüfen ob Teil da
  199. while (!isSet(DIGITAL_IN, EINGANG_HAUPTBAND_VOR_WEICHE)) {
  200. // Pollingfrequenz
  201. rt_sleep(5 * nano2count(1000000));
  202. }
  203. // Teil muss Sensor verlassen haben
  204. while (isSet(DIGITAL_IN, EINGANG_HAUPTBAND_VOR_WEICHE)) {
  205. // Pollingfrequenz
  206. rt_sleep(5 * nano2count(1000000));
  207. }
  208. rt_sem_wait(&hauptband_kreuzung_sem);
  209. hauptband_kreuzung_geblockt--;
  210. rt_sem_signal(&hauptband_kreuzung_sem);
  211. while (isSet(DIGITAL_IN, EINGANG_HAUPTBAND_VOR_WEICHE)) {
  212. // Pollingfrequenz
  213. rt_sleep(5 * nano2count(1000000));
  214. }
  215. }
  216. }
  217.  
  218. /* Control Task */
  219. static void pruefercontrol(long x) {
  220.  
  221. //Initialisierung
  222. rt_printk("control: task started\n");
  223.  
  224. /* Verbindung zum Modbus-Knoten herstellen */
  225. if ((fd_node = rt_modbus_connect("modbus-node")) == -1) {
  226.  
  227. rt_printk("control: task exited\n");
  228. return;
  229. }
  230. rt_printk("control: MODBUS communication opened\n");
  231. rt_printk("%i\n", readModbus(DIGITAL_OUT));
  232. deleteAll();
  233.  
  234. current_Modbus_Out = readModbus(DIGITAL_OUT);
  235. // Vor dieser Zeile keinen Code einfügen!!!
  236.  
  237. // Auswerfer in definierten Zustand bringen
  238. set(AUSGANG_AUSWERFER_RECHTS);
  239. rt_printk("Druck rechts\n");
  240. set(AUSGANG_AUSWERFER_LINKS);
  241. rt_printk("Druck links\n");
  242. set(AUSGANG_AUSWERFER_SPERRE_ENTFERNEN);
  243. // Druck aufbauen
  244. rt_sleep(50 * nano2count(1000000));
  245. delete(AUSGANG_AUSWERFER_LINKS);
  246. rt_printk("Warte, bis Auswerfer rechts ist...\n");
  247. while(!isSet(DIGITAL_IN, EINGANG_AUSWERFER_RECHTS)) {
  248. // Pollingfrequenz
  249. rt_sleep(50 * nano2count(1000000));
  250. }
  251. rt_printk("... Auswerfer ist rechts.\n");
  252. // kann ggf. weg.
  253. //rt_sleep(50 * nano2count(1000000));
  254.  
  255. // Auswerfer in die Mitte setzen:
  256. delete(AUSGANG_AUSWERFER_SPERRE_ENTFERNEN);
  257. // Druck aufbauen
  258. rt_sleep(50 * nano2count(1000000));
  259. set(AUSGANG_AUSWERFER_RECHTS);
  260. set(AUSGANG_AUSWERFER_LINKS);
  261. // Druck aufbauen
  262. rt_sleep(50 * nano2count(1000000));
  263. delete(AUSGANG_AUSWERFER_RECHTS);
  264.  
  265. //Magazine einfahren, falls ausgefahren
  266. if(isSet(DIGITAL_IN, EINGANG_MAGAZIN1_AUSGEFAHREN)) {
  267. set(AUSGANG_MAGAZIN1_EINFAHREN);
  268. // Druck aufbauen
  269. rt_sleep(50 * nano2count(1000000));
  270. delete(AUSGANG_MAGAZIN1_EINFAHREN);
  271. }
  272. if(isSet(DIGITAL_IN, EINGANG_MAGAZIN2_AUSGEFAHREN)) {
  273. set(AUSGANG_MAGAZIN2_EINFAHREN);
  274. // Druck aufbauen
  275. rt_sleep(50 * nano2count(1000000));
  276. delete(AUSGANG_MAGAZIN2_EINFAHREN);
  277. }
  278. if(isSet(DIGITAL_IN, EINGANG_MAGAZIN3_AUSGEFAHREN)) {
  279. set(AUSGANG_MAGAZIN3_EINFAHREN);
  280. // Druck aufbauen
  281. rt_sleep(50 * nano2count(1000000));
  282. delete(AUSGANG_MAGAZIN3_EINFAHREN);
  283. }
  284. if(isSet(DIGITAL_IN, EINGANG_AUSWURF_MASSENMAGAZIN_AUSGEFAHREN)) {
  285. set(AUSGANG_AUSWURF_MASSENMAGAZIN);
  286. // Druck aufbauen
  287. rt_sleep(50 * nano2count(1000000));
  288. delete(AUSGANG_AUSWURF_MASSENMAGAZIN);
  289. rt_printk("Initialisierung Massenmagazin...\n");
  290. while(isSet(DIGITAL_IN, EINGANG_AUSWURF_MASSENMAGAZIN_AUSGEFAHREN)) {
  291. // Pollingfrequenz
  292. rt_sleep(50 * nano2count(1000000));
  293. }
  294. rt_printk("... Massenmagazin initialisiert!\n");
  295. }
  296.  
  297. // Den Vereinzeler-Task brauchen wir bereits hier
  298. rt_task_resume(&vereinzeler_task);
  299. rt_printk("Vereinzeler geladen\n");
  300.  
  301. //Zubringerband an und auf volle Geschwindigkeit
  302. rt_modbus_set(fd_node, IB_IL_AO, 0, 30000);
  303. set(AUSGANG_ZUBRINGERBAND_AN);
  304.  
  305. // Hauptband an
  306. set(AUSGANG_HAUPTBAND_AN_RECHTS);
  307. // Leerfahrt der Bänder
  308. rt_printk("Leerfahrt\n");
  309. rt_sleep(10000 * nano2count(1000000));
  310.  
  311. // Massenmagazinband leerlaufen lassen...
  312. set(AUSGANG_MASSENMAGAZINBAND_AN);
  313. rt_sleep(3000 * nano2count(1000000));
  314. delete(AUSGANG_MASSENMAGAZINBAND_AN);
  315. rt_printk("Massenmagazinband fertig\n");
  316. rt_sleep(4000 * nano2count(1000000));
  317. rt_printk("Resuming tasks.\n\n---------------------------------------------\n\n");
  318.  
  319. rt_task_resume(&magazin_task);
  320. rt_printk("Magazin geladen\n");
  321.  
  322. rt_task_resume(&massenmagazin_task);
  323. rt_printk("Massenmagazin geladen\n");
  324.  
  325. rt_task_resume(&auswerfer_task);
  326. rt_printk("Auswerfer geladen\n");
  327.  
  328. rt_task_resume(&rutsche_task);
  329. rt_printk("Rutsche geladen\n");
  330.  
  331. rt_printk("Initialisiert\n");
  332.  
  333.  
  334. //Pruefer-funktion
  335. while (1) {
  336. if(isSet(DIGITAL_IN, EINGANG_HAUPTBAND_VOR_WEICHE)){
  337. if(isSet(DIGITAL_IN, EINGANG_HOEHENSENSOR_VERDREHT)){
  338. // Nachricht an Auswerfer
  339. char msg = 'a';
  340. rt_mbx_send(&pruefer_an_auswerfer_mbx, &msg, sizeof(char));
  341. }
  342. while(isSet(DIGITAL_IN, EINGANG_HAUPTBAND_VOR_WEICHE)){
  343. // Pollingrequenz
  344. rt_sleep(5 * nano2count(1000000));
  345. }
  346. }
  347.  
  348. // Prüfer muss schnell reagieren können, daher wenig sleep
  349. rt_sleep(5 * nano2count(1000000));
  350. }
  351. }
  352.  
  353. /* Vereinzeler */
  354. static void vereinzeler(long x) {
  355. char bandaus = 0;
  356. while (1) {
  357. if (isSet(DIGITAL_IN, EINGANG_VEREINZELER_TEIL_DA)) {
  358. int i = 0;
  359. set(AUSGANG_VEREINZELER);
  360. do {
  361. if(isSet(DIGITAL_OUT, AUSGANG_HAUPTBAND_ANHALTEN) && !bandaus) {
  362. continue;
  363. }
  364. // Pollingfrequenz
  365. rt_sleep(50 * nano2count(1000000));
  366. i++;
  367. if (i >= 20) {
  368. set(AUSGANG_HAUPTBAND_ANHALTEN);
  369. // Warten, damit Band sicher angehalten ist
  370. rt_sleep(100 * nano2count(1000000));
  371. bandaus = 1;
  372. }
  373.  
  374. } while (isSet(DIGITAL_IN, EINGANG_VEREINZELER_TEIL_DA) && i <= 20);
  375. if (bandaus) {
  376. delete(AUSGANG_VEREINZELER);
  377. rt_sem_wait(&alles_anhalten_sem);
  378. alles_anhalten = 1;
  379. rt_sem_signal(&alles_anhalten_sem);
  380.  
  381. while (isSet(DIGITAL_IN, EINGANG_ZUBRINGERBAND_ENDE)) {
  382. // Pollingfrequenz
  383. rt_sleep(50 * nano2count(1000000));
  384. }
  385. delete(AUSGANG_HAUPTBAND_ANHALTEN);
  386. // warten bis sicher angelaufen
  387. rt_sleep(50 * nano2count(1000000));
  388. set(AUSGANG_VEREINZELER);
  389. while (isSet(DIGITAL_IN, EINGANG_VEREINZELER_TEIL_DA)) {
  390. // Pollingfrequenz
  391. rt_sleep(50 * nano2count(1000000));
  392. }
  393. rt_sem_wait(&alles_anhalten_sem);
  394. alles_anhalten = 0;
  395. rt_sem_signal(&alles_anhalten_sem);
  396. bandaus = 0;
  397. }
  398. delete(AUSGANG_VEREINZELER);
  399. }
  400. // Linux Zeit abgeben
  401. rt_sleep(100 * nano2count(1000000));
  402. }
  403. }
  404.  
  405. /* Magazin */
  406. static void magazin(long x) {
  407. int i = 0;
  408. while (1) {
  409. pollKreuzung();
  410. if (isSet(DIGITAL_IN, EINGANG_MAGAZIN3_TEIL_DA)) {
  411. rt_printk("Magazin 3: Blockiere Hauptband\n");
  412. rt_sem_wait(&hauptband_kreuzung_sem);
  413. hauptband_kreuzung_geblockt = 1;
  414. rt_sem_signal(&hauptband_kreuzung_sem);
  415. magazinAuswerfen(3);
  416. }
  417. else if (isSet(DIGITAL_IN, EINGANG_MAGAZIN2_TEIL_DA)) {
  418.  
  419. magazinAuswerfen(2);
  420.  
  421. while (!isSet(DIGITAL_IN, EINGANG_HAUPTBAND_ZW2U3)) {
  422. // Pollingfrequenz
  423. rt_sleep(5 * nano2count(1000000));
  424. }
  425. rt_printk("Magazin 2: Blockiere Hauptband\n");
  426. rt_sem_wait(&hauptband_kreuzung_sem);
  427. hauptband_kreuzung_geblockt = 1;
  428. rt_sem_signal(&hauptband_kreuzung_sem);
  429.  
  430. } else if (isSet(DIGITAL_IN, EINGANG_MAGAZIN1_TEIL_DA)) {
  431.  
  432. magazinAuswerfen(1);
  433.  
  434. while (!isSet(DIGITAL_IN, EINGANG_HAUPTBAND_ZW2U3)) {
  435. // Pollingfrequenz
  436. rt_sleep(5 * nano2count(1000000));
  437. }
  438. rt_printk("Magazin 1: Blockiere Hauptband\n");
  439. rt_sem_wait(&hauptband_kreuzung_sem);
  440. hauptband_kreuzung_geblockt = 1;
  441. rt_sem_signal(&hauptband_kreuzung_sem);
  442. } else {
  443. if(massenmagazin_leer){
  444. i++;
  445. if(i >= 11){
  446. set(AUSGANG_HAUPTBAND_ANHALTEN);
  447. while(i){
  448. if (isSet(DIGITAL_IN, EINGANG_MAGAZIN3_TEIL_DA) || isSet(DIGITAL_IN, EINGANG_MAGAZIN2_TEIL_DA)|| isSet(DIGITAL_IN, EINGANG_MAGAZIN1_TEIL_DA)|| isSet(DIGITAL_IN, EINGANG_AUSWURF_MASSENMAGAZIN_TEIL_DA)) {
  449. delete(AUSGANG_HAUPTBAND_ANHALTEN);
  450. i = 0;
  451. }
  452. }
  453. }
  454. }
  455. }
  456. // Linux Zeit abgeben
  457. rt_sleep(1000 * nano2count(1000000));
  458. }
  459. }
  460.  
  461. /* Massenmagazin */
  462. static void massenmagazin(long x) {
  463. char ausgeworfen = 0;
  464. while (1) {
  465. start:
  466. if(ausgeworfen==0){
  467. //wenn nichts ausgeworfen, dann auswerfen
  468. if(isSet(DIGITAL_IN, EINGANG_AUSWURF_MASSENMAGAZIN_TEIL_DA)){
  469. set(AUSGANG_MASSENMAGAZINBAND_AN);
  470. set(AUSGANG_AUSWURF_MASSENMAGAZIN);
  471. // Warten bis Teil aus Vereinzeler gefahren
  472. rt_sleep(500 * nano2count(1000000));
  473. delete(AUSGANG_AUSWURF_MASSENMAGAZIN);
  474. ausgeworfen = 1;
  475. // Warten bis Teil vorne ist, Task muss in der Zeit nichts machen...
  476. rt_sleep(1500 * nano2count(1000000));
  477. }
  478. else {
  479. massenmagazin_leer = 1;
  480. delete(AUSGANG_MASSENMAGAZINBAND_AN);
  481. while(!isSet(DIGITAL_IN, EINGANG_AUSWURF_MASSENMAGAZIN_TEIL_DA)){
  482. // Pollingfrequenz
  483. rt_sleep(100 * nano2count(1000000));
  484. }
  485. set(AUSGANG_MASSENMAGAZINBAND_AN);
  486. goto start;
  487. }
  488. }
  489. // warten bis Teil vorne
  490. while(!isSet(DIGITAL_IN, EINGANG_MASSENMAGAZINBAND_ENDE)) {
  491. // Pollingfrequenz
  492. rt_sleep(100 * nano2count(1000000));
  493. }
  494. //Band anhalten
  495. delete(AUSGANG_MASSENMAGAZINBAND_AN);
  496. // Fragen, ob Kreuzung frei ist
  497. rt_sem_wait(&hauptband_kreuzung_sem);
  498. while(hauptband_kreuzung_geblockt) {
  499. rt_sem_signal(&hauptband_kreuzung_sem);
  500. // Pollingfrequenz
  501. rt_sleep(100 * nano2count(1000000));
  502. rt_sem_wait(&hauptband_kreuzung_sem);
  503. }
  504. rt_sem_signal(&hauptband_kreuzung_sem);
  505. set(AUSGANG_MASSENMAGAZINBAND_AN);
  506. hauptband_kreuzung_geblockt = 1;
  507. rt_sem_signal(&hauptband_kreuzung_sem);
  508. ausgeworfen = 0;
  509.  
  510. // Linux Zeit abgeben
  511. rt_sleep(500 * nano2count(1000000));
  512. }
  513. }
  514.  
  515. /* Auswurf Task */
  516. static void auswerfer(long x) {
  517. char msg;
  518. while (1) {
  519. // Nur arbeiten, wenn Teil ausgeworfen werden muss
  520. rt_mbx_receive(&pruefer_an_auswerfer_mbx, &msg, sizeof(char));
  521. set(AUSGANG_AUSWERFER_LINKS);
  522. set(AUSGANG_AUSWERFER_RECHTS);
  523. set(AUSGANG_AUSWERFER_SPERRE_ENTFERNEN);
  524. //Druckaufbau
  525. rt_sleep(50 * nano2count(1000000));
  526. delete(AUSGANG_AUSWERFER_LINKS);
  527.  
  528. while(!isSet(DIGITAL_IN, EINGANG_AUSWERFER_RECHTS)) {
  529. // Pollingfrequenz
  530. rt_sleep(10 * nano2count(1000000));
  531. }
  532. // Druck aufbauen
  533. rt_sleep(50 * nano2count(1000000));
  534.  
  535. rt_mbx_send(&auswerfer_an_rutsche_mbx, &msg, sizeof(char));
  536. rt_mbx_receive(&rutsche_an_auswerfer_mbx, &msg, sizeof(char));
  537.  
  538. while(!isSet(DIGITAL_IN, EINGANG_RUTSCHE_VOLL)){
  539. // niedrige Pollingfrequenz, weil Task sowieso nur arbeitet, wenn wirklich nötig
  540. rt_sleep(5 * nano2count(1000000));
  541. }
  542. // in die Mitte setzen:
  543. set(AUSGANG_AUSWERFER_LINKS);
  544. set(AUSGANG_AUSWERFER_RECHTS);
  545. delete(AUSGANG_AUSWERFER_SPERRE_ENTFERNEN);
  546. //Druckaufbau
  547. rt_sleep(50 * nano2count(1000000));
  548. delete(AUSGANG_AUSWERFER_RECHTS);
  549. }
  550. }
  551.  
  552. static void rutsche(long x){
  553. char msg;
  554. while (1) {
  555. // Arbeitet nur wenn Teil ausgeworfen wurde
  556. rt_mbx_receive(&auswerfer_an_rutsche_mbx, &msg, sizeof(char));
  557. if(isSet(DIGITAL_IN, EINGANG_RUTSCHE_VOLL)){
  558. // Zeit zwischen beiden Abfragen
  559. rt_sleep(50 * nano2count(1000000));
  560. if(isSet(DIGITAL_IN, EINGANG_RUTSCHE_VOLL)){
  561. set(AUSGANG_HAUPTBAND_ANHALTEN);
  562. while(isSet(DIGITAL_IN, EINGANG_RUTSCHE_VOLL)){
  563. // Pollingfrequenz
  564. rt_sleep(50 * nano2count(1000000));
  565. }
  566. rt_sem_signal(&alles_anhalten_sem);
  567. while(alles_anhalten){
  568. rt_sem_signal(&alles_anhalten_sem);
  569. //Pollingfrequenz
  570. rt_sleep(100 * nano2count(1000000));
  571. rt_sem_signal(&alles_anhalten_sem);
  572. }
  573. rt_sem_signal(&alles_anhalten_sem);
  574.  
  575. delete(AUSGANG_HAUPTBAND_ANHALTEN);
  576. msg = 'v';
  577. }
  578. }
  579. else {
  580. msg = 'f';
  581. }
  582. rt_mbx_send(&rutsche_an_auswerfer_mbx, &msg, sizeof(char));
  583.  
  584. rt_sleep(500 * nano2count(1000000));
  585. }
  586. }
  587.  
  588. /* Funktion, die beim Entfernen des Moduls aufgerufen wird */
  589. static void __exit
  590. example_exit(void) {
  591. /* Task loeschen */
  592. rt_task_delete(&pruefercontrol_task);
  593. rt_task_delete(&vereinzeler_task);
  594. rt_task_delete(&magazin_task);
  595. rt_task_delete(&massenmagazin_task);
  596. rt_task_delete(&auswerfer_task);
  597. rt_task_delete(&rutsche_task);
  598.  
  599. /* Semaphoren löschen */
  600. rt_sem_delete(&hauptband_kreuzung_sem);
  601. rt_sem_delete(&modbus_sem);
  602. rt_sem_delete(&alles_anhalten_sem);
  603.  
  604. /* Mailboxen löschen */
  605. rt_mbx_delete(&pruefer_an_auswerfer_mbx);
  606. rt_mbx_delete(&rutsche_an_auswerfer_mbx);
  607. rt_mbx_delete(&auswerfer_an_rutsche_mbx);
  608. /* Timer stoppen */
  609. stop_rt_timer();
  610. printk("DZE Gruppe E9 unloaded\n");
  611. }
  612.  
  613. /* Funktion die beim Laden des Moduls aufgerufen wird */
  614. static int __init
  615. example_init(void) {
  616. /* variables Timing basierend auf dem CPU-Takt */
  617. rt_set_oneshot_mode();
  618. /* Timer starten */
  619. start_rt_timer(0);
  620. /* Modbuskommunikation initialisieren */
  621. modbus_init();
  622.  
  623. /* Taskinitialisierung
  624. *
  625. * &task = Adresse des zu initialisierenden TCB
  626. * control = zum Task gehörende Funktion
  627. * 0 = Uebergabeparameter an die zum Task gehoerende Funktion (long)
  628. * 1024 = Stacksize
  629. * 0 = Priorität des Tasks (0 = groesste)
  630. * 0 = uses_fpu (Fliesskommaeinheit nicht benutzen); im Praktikum sollte es 0 bleiben
  631. * NULL = &signal_handler; Referenz zu einer Fkt., die bei jeder Aktivierung
  632. * des Tasks aufgerufen wird, ansonsten NULL
  633. *
  634. * Achtung: Nach der Initialisierung ist der Task "suspended"!
  635. *
  636. */
  637. if (rt_task_init(&pruefercontrol_task, pruefercontrol, 0,
  638. 10240, 0, 0, NULL)) {
  639. printk("prueferrutschecontrol kann nicht starten\n");
  640. goto fail;
  641. }
  642. if (rt_task_init(&vereinzeler_task, vereinzeler, 0, 10240, 1, 0, NULL)) {
  643. printk("vereinzeler kann nicht starten\n");
  644. goto fail;
  645. }
  646. if (rt_task_init(&magazin_task, magazin, 0, 10240, 1, 0, NULL)) {
  647. printk("magazin kann nicht starten\n");
  648. goto fail;
  649. }
  650. if (rt_task_init(&massenmagazin_task, massenmagazin, 0, 10240, 1, 0,
  651. NULL)) {
  652. printk("massenmagazin kann nicht starten\n");
  653. goto fail;
  654. }
  655. if (rt_task_init(&auswerfer_task, auswerfer, 0, 10240, 1, 0, NULL)) {
  656. printk("auswerfer kann nicht starten\n");
  657. goto fail;
  658. }
  659. if (rt_task_init(&rutsche_task, rutsche, 0, 10240, 1, 0, NULL)) {
  660. printk("rutsche kann nicht starten\n");
  661. goto fail;
  662. }
  663.  
  664. /* Semaphoren initialisieren */
  665. rt_typed_sem_init(&hauptband_kreuzung_sem, 1, BIN_SEM | FIFO_Q);
  666. rt_typed_sem_init(&modbus_sem, 1, BIN_SEM | FIFO_Q);
  667. rt_typed_sem_init(&alles_anhalten_sem, 1, BIN_SEM | FIFO_Q);
  668.  
  669. /* Mailboxen initialisieren */
  670. rt_mbx_init(&pruefer_an_auswerfer_mbx, 3 * sizeof(char));
  671. rt_mbx_init(&rutsche_an_auswerfer_mbx, 3 * sizeof(char));
  672. rt_mbx_init(&auswerfer_an_rutsche_mbx, 3 * sizeof(char));
  673.  
  674. /* suspend -> ready bzw. running */
  675. rt_task_resume(&pruefercontrol_task);
  676.  
  677. printk("DZE Gruppe E9 loaded\n");
  678. return (0);
  679.  
  680. fail:
  681. /* Aufraeumen */
  682. stop_rt_timer();
  683. return (1);
  684. }
  685.  
  686. /* Modulein- und ausstieg festlegen */
  687. module_exit(example_exit)
  688. module_init(example_init)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement