468,167 Members | 1,909 Online
Bytes | Developer Community
New Post

Home Posts Topics Members FAQ

Post your question to a community of 468,167 developers. It's quick & easy.

Automating valves and obtaining data with a sensor

Hello,
I am a PhD student in marine geochemistry who has a big problem (I have 0 knowledge on computers/electronics). Hopefully one of you computer geniuses can help me. I have an iron measuring system with a photon multiplier tube (PMT, a light sensor), 1 2-way 6-port valve and 1 6-position valve. I have been given a .bas file that is opened with qbasic which follows a specific sequence at pre-determined times. What I want to do is add another 6-position valve that would change position after going through the existing loop.
Although I cannot offer any of you any money, since I am a PhD students (aka poor slave), I will thank you in my thesis which will be presented in 3-years, plus in the acknowledgements of any article I write running this system (about 60% of the work I have to do in the next 3 years).

This is how it works.
V1 is he 2-way valve
V2 is the 6-position valve, although only positions 1 and 2 are needed (in the current version 1-3 are used, though 1 and 3 carry the same reagent).
V3 would be the new valve, and it would change every cycle though the system
Plus the sensor data has to be saved to a document (1 column with the values every 0.1s (ideally) - 0.5s (lowest resolution) is enough). saving the file as year-month-day-identifier (eg. 20171019001))
Current:
Step V1 V2 Time (s)
1 2 1 60
2 1 2 120
3 1 3 60
4 2 3 120
Ideally:
Step V1 V2 Time (s)
1 2 1 60
2 1 2 120
3 1 1 60
4 2 1 120
repeat steps 2-4 two more times
then change V3 to the next position.


The current code is:
Expand|Select|Wrap|Line Numbers
  1.  
  2.         DECLARE SUB arretpm ()
  3.  
  4.  
  5.  
  6.  
  7. '*******************************************************************
  8. ' PROGRAMME DE FLOW INJECTION ANALYSIS
  9. ' stockage des donnees dans un fichier s‚quentiel lisible sous EXCEL
  10. ' possibilite d'impression des int‚grales du signal
  11. '*******************************************************************
  12.  
  13.  
  14. DECLARE SUB ACQUIRE (donnee$, byte)
  15. DECLARE SUB CONVERT (donnee$, count)
  16. DECLARE SUB MOTCOMMU (com$)
  17. DECLARE SUB MOTINJ (inj$)
  18. DECLARE SUB INJECTION (tempinj%, delai%)
  19. DECLARE SUB SAUVEGARDE (fichier$)
  20. DECLARE SUB IMPRESSION (drapimp$)
  21. DECLARE SUB integration (donnee(), findo%, drapimp$, enrfichier$, MAX)
  22. DECLARE SUB EXECUTION (reac$(), tempcom%(), tempinj%, delai%, fichier$, drapimp$)
  23. DECLARE SUB COMMUTATION (posi%(), reac$(), tempcom%())
  24. DECLARE SUB modification (i)
  25. DECLARE SUB ACQUISITION (n%, donnee(), CHRONO, t(), ini, FIN%)
  26. DIM SHARED reac$(6), tempcom%(6), posi%(6), donnee(3000), t(3000), donneec(3000)
  27. DEFINT E
  28. DEFINT F
  29. 'TYPE typeenreg
  30. '        t AS INTEGER
  31. '        donnee AS DOUBLE
  32. 'END TYPE
  33. 'DIM SHARED enregistre AS typeenreg
  34.  
  35. SCREEN 9
  36. 'Initialisation du port serie RS232C
  37. ' Set up initial du M1131
  38.         ' adresse : 2
  39.         ' baud rate : 9600
  40.         ' no linefeed
  41.         ' no parity
  42.         ' alarm of
  43.         ' no echo
  44.         ' 2 characters delay
  45. 'OPEN COM2
  46. ' lecture valeur analogique $RD1
  47. ' commande rotation moteur
  48. ' rotation moteur commutation $1DO02 + $1DO03 :' ss programme MOTCOM
  49. ' rotation moteur injection $1DO01 + $1DO03 :' ss programme MOTINJ
  50. ' rotation moteur commutation et moteur injection $1DO00 + $1DO03 :' ss programme MOTEURS
  51. 'lecture des paramŠtres de commmande de la vanne de commutation
  52. FOR i = 1 TO 6
  53.     posi%(i) = i
  54.     READ reac$(i), tempcom%(i)
  55. NEXT i
  56. READ tempinj%
  57. READ delai%
  58. READ fichier$
  59. DO
  60. VIEW
  61. CLS
  62. LOCATE 2, 5
  63. PRINT "Programme H2O2"
  64. LOCATE 3, 5
  65. PRINT "UMR CNRS 6539"
  66. 'affichage des valeurs par d‚faut
  67.         LINE (10, 60)-(280, 300), , B
  68.         LINE (300, 10)-(635, 300), , B
  69.         LINE (10, 10)-(280, 50), , B
  70.         LINE (50, 320)-(580, 340), , B
  71.         LOCATE 3, 40: PRINT "Param‚trage de la vanne de s‚lection"
  72.         LOCATE 5, 40: PRINT "Nø"
  73.         LOCATE 5, 49: PRINT "r‚actif"
  74.         LOCATE 5, 64: PRINT "temps (s)"
  75.         FOR i = 1 TO 6
  76.                 LOCATE 7 + 2 * (i - 1), 40
  77.                 PRINT posi%(i)
  78.                 LOCATE 7 + 2 * (i - 1), 49
  79.                 PRINT reac$(i)
  80.                 LOCATE 7 + 2 * (i - 1), 64
  81.                 PRINT tempcom%(i)
  82.         NEXT i
  83.         LOCATE 19, 40: PRINT "Param‚trage injection et acquisition "
  84.         LOCATE 21, 40: PRINT "Dur‚e : "; tempinj%; " s  "; "Fr‚quence : "; 100 / delai%; " Hz"
  85.         LOCATE 24, 10: PRINT "nom du fichier de sauvegarde des donn‚es : "; fichier$;
  86.  
  87.  
  88.  
  89.  
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.  
  98.  
  99.         'ecran menu principal
  100.  
  101.         LOCATE 7, 1: PRINT " 1 Programmation de la commutation"
  102.         LOCATE 9, 1: PRINT " 2 Programmation de l'injection "
  103.         LOCATE 11, 1: PRINT " 3 Sauvegarde des donn‚es"
  104.         LOCATE 13, 1: PRINT " 4 Impression des r‚sultats"
  105.         IF drapimp$ = "imp" THEN LOCATE 13, 28: PRINT " active"
  106.         LOCATE 15, 1: PRINT " 5 Ex‚cution"
  107.         LOCATE 17, 1: PRINT " 6 Quitter"
  108.         LOCATE 19, 7: PRINT " Entrez le choix";
  109.  
  110.         INPUT j
  111.         SELECT CASE j
  112.                 CASE 1
  113.                         CALL COMMUTATION(posi%(), reac$(), tempcom%())
  114.                 CASE 2
  115.                         CALL INJECTION(tempinj%, delai%)
  116.                 CASE 3
  117.                         CALL SAUVEGARDE(fichier$)
  118.                 CASE 4
  119.                         CALL IMPRESSION(drapimp$)
  120.                 CASE 5
  121.                         CALL EXECUTION(reac$(), tempcom%(), tempinj%, delai%, fichier$, drapimp$)
  122.                 CASE 6
  123.                         EXIT DO
  124.                 CASE ELSE
  125.                         BEEP
  126.         END SELECT
  127. LOOP
  128. DATA MQ,60,ech,120, , , , , , ,MQ,60,120,10,NA
  129.  
  130.  
  131.  
  132.  
  133.  
  134.  
  135. END
  136.  
  137. DEFSNG E-F
  138. SUB ACQUIRE (donnee$, byte)
  139. WHILE LOC(1) < byte: WEND
  140. donnee$ = INPUT$(byte, #1)
  141. END SUB
  142.  
  143. SUB ACQUISITION (n%, donnee(), CHRONO, t(), ini, FIN%)
  144.  
  145. byte = 4
  146. 'envoi message lecture
  147. 'WHILE TIMER < t: WEND
  148. PRINT #1, "S"
  149. CALL ACQUIRE(donnee$, byte)
  150. CALL CONVERT(donnee$, count)
  151. donnee(n%) = count
  152.         WRITE #4, donnee(n%)
  153. '        PRINT DONNEE(n%)
  154. CHRONO = TIMER * 100
  155. END SUB
  156.  
  157. DEFINT E
  158. SUB arretpm
  159. PRINT #1, "V" + CHR$(0) + CHR$(0)
  160. CALL ACQUIRE(donnee$, byte)
  161. WHILE INKEY$ <> ""
  162. BEEP
  163. WEND
  164. END
  165. END SUB
  166.  
  167. DEFSNG E
  168. SUB COMMUTATION (posi%(), reac$(), tempcom%())
  169. CLS
  170.  
  171. 'affichage des paramŠtres
  172. LOCATE 2, 5: PRINT " PROGRAMMATION DE LA VANNE DE COMMUTATION"
  173. LOCATE 4, 11: PRINT "Nø"
  174. LOCATE 4, 20: PRINT "r‚actif"
  175. LOCATE 4, 35: PRINT "temps (s)"
  176. FOR i = 1 TO 6
  177.   LOCATE 6 + 2 * (i - 1), 10
  178.   PRINT posi%(i)
  179.   LOCATE 6 + 2 * (i - 1), 20
  180.   PRINT reac$(i)
  181.   LOCATE 6 + 2 * (i - 1), 35
  182.   PRINT tempcom%(i)
  183. NEXT i
  184.  
  185. 'modification des paramŠtres de commandes
  186. DO
  187.   LOCATE 21, 5: PRINT "pour modifier taper le numero de la position ou 0 pour quitter"
  188.   LOCATE 23, 5: INPUT i
  189.     SELECT CASE i
  190.       CASE 1 TO 6
  191.         CALL modification(i)
  192.       CASE 0
  193.         EXIT DO
  194.       CASE ELSE
  195.         BEEP
  196.     END SELECT
  197. LOOP
  198. CLS
  199. END SUB
  200.  
  201. DEFINT E
  202. SUB CONVERT (donnee$, count)
  203. 'PRINT donnee$
  204. 'WHILE INKEY$ = "": WEND
  205. B3 = ASC(LEFT$(donnee$, 1))
  206.  
  207. IF B3 > 128 THEN BEEP: PRINT "OVERFLOW": CALL arretpm
  208. B2 = ASC(MID$(donnee$, 2, 1))
  209. 'PRINT B2
  210. B1 = ASC(MID$(donnee$, 3, 1))
  211.  
  212. 'PRINT B1
  213. B0 = ASC(MID$(donnee$, 4, 1))
  214. 'PRINT B0
  215. 'WHILE INKEY$ = "": WEND
  216. count = (B3 * 256 ^ 3 + B2 * 256 ^ 2 + B1 * 256 + B0)
  217. 'ELSE COLOR 4: PRINT "OVERFLOW!!!": BEEP: COLOR 7
  218. 'END IF
  219. END SUB
  220.  
  221. DEFSNG E
  222. '
  223. SUB EXECUTION (reac$(), tempcom%(), tempinj%, delai%, fichier$, drapimp$)
  224.  
  225. 'repetition de la sequence d'analyse
  226. 'incrementation du fichier
  227.  
  228. numfichier = 0
  229. OPEN "COM1:9600,N,8,1,CS,DS" FOR RANDOM AS #1
  230. byte = 2
  231. PRINT #1, "P" + CHR$(100)
  232. CALL ACQUIRE(donnee$, byte)
  233. PRINT #1, "R" + CHR$(1)
  234. CALL ACQUIRE(donnee$, byte)
  235. PRINT #1, "D"
  236. CALL ACQUIRE(donnee$, byte)
  237. t = TIMER + 2: WHILE TIMER < t: WEND
  238. byte = 4
  239. PRINT #1, "S"
  240. CALL ACQUIRE(donnee$, byte)
  241. 'PRINT donnee$
  242. 'WHILE INKEY$ = "": WEND
  243. CALL CONVERT(donnee$, count)
  244. 'PRINT count
  245. DO UNTIL INKEY$ <> ""
  246. numfichier = numfichier + 1
  247. enrfichier$ = "c:" + fichier$ + LTRIM$(STR$(numfichier)) + ".dat"
  248. OPEN "COM2: 9600, N,8,1,RS,CS0,DS0,CD0" FOR RANDOM AS #2
  249. PRINT #2, "@01"
  250. SLEEP 1
  251. PRINT #2, "@02"
  252. SLEEP 1
  253. 'OPEN enrfichier$ FOR RANDOM AS #1 LEN = LEN(enregistre)
  254. OPEN enrfichier$ FOR OUTPUT AS #4
  255.  
  256. 'FIN% = 0
  257.  
  258.  
  259.  VIEW
  260.   visible = TIMER + 15
  261.   WHILE TIMER < visible
  262. WEND
  263.   CLS
  264.   inj$ = "01g1"
  265.   CALL MOTINJ(inj$)
  266.   temp = TIMER
  267.   WHILE TIMER < temp + 2
  268.   WEND
  269.  
  270.         LOCATE 2, 5
  271.         PRINT "Programme FIAGS1PM"
  272.         LOCATE 3, 5
  273.         PRINT "UMR CNRS 6539      "; enrfichier$
  274.         LINE (10, 10)-(280, 50), , B
  275.         LINE (10, 260)-(280, 260)
  276.         LINE (10, 60)-(280, 310), , B
  277.                 FOR i = 1 TO 6
  278.                         f = 48 + i
  279.                         PRINT #2, "02g" + CHR$(f)
  280.                         'CALL MOTCOMMU(com$)
  281.                         TEMPS = TIMER + tempcom%(i)
  282.                         LOCATE 5, 2: PRINT "Nø"
  283.                         LOCATE 5, 11: PRINT "r‚actif"
  284.                         LOCATE 5, 26: PRINT "temps (s)"
  285.                         LOCATE 7 + 2 * (i - 1), 2
  286.                         PRINT posi%(i)
  287.                         LOCATE 7 + 2 * (i - 1), 11
  288.                         PRINT reac$(i)
  289.                         LOCATE 7 + 2 * (i - 1), 26
  290.                         PRINT tempcom%(i)
  291.                         WHILE TIMER < TEMPS
  292.                         LOCATE 20, 10: PRINT "temps restant "; INT(TEMPS - TIMER); " s"
  293.                         WEND
  294.                 NEXT i
  295.         LOCATE 20, 3: PRINT "‚lution et acquisition ";
  296.         PRINT tempinj%; " s"
  297.         TEMPS = TIMER + tempinj%
  298.         CHRONO = INT(TIMER * 100): 'CHRONO=temps initial relatif en 100Šme de s
  299.         ini = INT(TIMER * 100): 'temps initial absolu
  300.         n% = 0
  301.  '       FIN% = LOF(1) / LEN(enregistre)
  302.  
  303.         ' rotation vanne injection en elution
  304.         inj$ = "01g2"
  305.         CALL MOTINJ(inj$)
  306.               MAX = 0: SOMME = 0:
  307.               WHILE TIMER < TEMPS
  308.                 TEMPRES = TEMPS - TIMER
  309.                 LOCATE 22, 3: PRINT INT(TEMPRES):
  310.                 LOCATE 22, 6: PRINT "s"
  311.                  LOCATE 22, 10: PRINT " Nbr acquisitions :"; n%
  312.                ' IF INT(TIMER * 100) > CHRONO + delai% THEN
  313.                n% = n% + 1
  314.                byte = 4
  315.                t = TIMER
  316.                CALL ACQUISITION(n%, donnee(), CHRONO, t(), ini, FIN%)
  317.                IF donnee(n%) > MAX THEN MAX = donnee(n%)
  318.                LOCATE 3, 50: PRINT "base line:"; donnee(1)
  319.                LOCATE 5, 50: PRINT "valeur max:"; MAX
  320.               ' SOMME = SOMME + donnee(n%)
  321.                WEND
  322. '        PRINT SOMME
  323. '       PRINT enrfichier$
  324.         findo% = n%
  325. '        FIN% = LOF(1) / LEN(enregistre)
  326.         ' ecriture marqueur fin enregistrement -10,0
  327. '        enregistre.t = -10
  328. '        enregistre.donnee = 0
  329. '        marqueur = FIN% + 1
  330. '        PUT #1, marqueur, enregistre
  331.  
  332.         ' rotation vanne injection en concentration
  333.         ' CALL MOTINJ
  334.  
  335.         'int‚gration
  336.         CALL integration(donnee(), findo%, drapimp$, enrfichier$, MAX)
  337.         CLOSE #4
  338.         CLOSE #2
  339.         LOOP
  340. CLOSE #1
  341. CLOSE #3
  342. END SUB
  343.  
  344. SUB IMPRESSION (drapimp$)
  345. CLS
  346. PRINT "pour activer l'imprimante taper imp"
  347. INPUT drapimp$
  348. IF drapimp$ = "imp" THEN OPEN "lpt1" FOR OUTPUT AS #3
  349. END SUB
  350.  
  351. SUB INJECTION (tempinj%, delai%)
  352.         CLS
  353.         LOCATE 3, 3
  354.         PRINT "le temps d'‚lution est de "; tempinj%; " s"
  355.         LOCATE 5, 3
  356.         PRINT "taper la nouvelle valeur ( min 51s) ou 0 pour quitter ";
  357.         INPUT i
  358.         IF i <> 0 THEN tempinj% = i
  359.         LOCATE 7, 3
  360.         PRINT "le delai d'acquisition est de "; delai%; "100Šme de s"
  361.         LOCATE 9, 3
  362.         PRINT " taper la nouvelle valeur ou 0 pour quitter"
  363.         INPUT j
  364.         IF j <> 0 THEN delai% = j
  365.         CLS
  366. END SUB
  367.  
  368. DEFINT E
  369. SUB integration (donnee(), findo%, drapimp$, enrfichier$, MAX)
  370.         'calcul de l'integrale et tracer de la courbe
  371.         'findo% = nombre d'acquisition
  372.    '     CLS
  373.   '      VIEW (330, 0)-(610, 340), , 0
  374.  '       LINE (0, 0)-(280, 330), , B
  375. '        LINE (0, 170)-(280, 170)
  376.  
  377.  '       INTEGRALE = 0
  378. '        integralec = 0
  379.         'calcul ligne de base
  380.        ' somini = 0: somfin = 0
  381.       '  FOR n% = 1 TO 10
  382.      '           somini = somini + donnee(n%)
  383.     '    NEXT n%
  384.    '     FOR n% = findo% - 9 TO findo%
  385.   '              somfin = somfin + donnee(n%)
  386.  '       NEXT n%
  387. '        moyini = somini / 10: moyfin = somfin / 10
  388.         'pente de la ligne de base entre 10 et findo%-9
  389.        ' pente = (moyfin - moyini) / (findo% - 20)
  390.         'ordonnee a l'origine de la ligne de base
  391.       '  ordonnee = moyini
  392.      '   LOCATE 5, 4: PRINT "pente de la ligne de base :"
  393.     '    LOCATE 6, 4: PRINT pente
  394.    '     LOCATE 8, 4: PRINT "ordonnee de la ligne de base :"
  395.   '      LOCATE 9, 4: PRINT ordonnee
  396.  '       PSET (11 * 280, (170 - ordonnee))
  397. '        FOR n% = 11 TO findo% - 10
  398.                 ' calcul int‚grale brute
  399.           '      INTEGRALE = INTEGRALE + donnee(n%)
  400.          '       LOCATE 11, 4: PRINT "int‚grale brute:";
  401.         '        PRINT INTEGRALE
  402.        '         'calcul int‚grale corrig‚e
  403.       '          donneec(n%) = donnee(n%) - (pente * (n% - 10) + ordonnee)
  404.      '           integralec = integralec + donneec(n%)
  405.     '            LOCATE 14, 4: PRINT "integrale corrigee:";
  406.    '             PRINT integralec
  407.   '
  408.  '          NEXT n%
  409.  
  410.                 'calcul de l'int‚grale corrig‚e version 2
  411.                '    integralecc = 0
  412.               '     FOR n% = findo% - 10 TO findo% - 50 STEP -1
  413.              '      integralecc = integralecc + donneec(n%)
  414.             '       NEXT n%
  415.            '        n% = n% - 1
  416.           '         WHILE donneec(n%) > 0
  417.          '          integralecc = integralecc + donneec(n%)
  418.         '           n% = n% - 1
  419.        '            WEND
  420.       '             LOCATE 17, 4: PRINT "integrale corrigee 2: ";
  421.      '              PRINT integralecc
  422.  
  423.  
  424.         ' trace dela courbe
  425.     '            PSET (1, (170 - donnee(1)))
  426.    '        FOR n% = 1 TO findo%
  427.   '              LINE -(n% / findo% * 280, (170 - donnee(n%)))
  428.  '         NEXT n%
  429.        ' trace de la ligne de base
  430. '        LINE (10 / findo% * 280, (170 - moyini))-((findo% - 9) / findo% * 280, (170 - moyfin))
  431.  
  432.       ' impression des integrales
  433.  
  434.       IF drapimp$ = "imp" THEN PRINT drapimp$: PRINT #3, enrfichier$, MAX
  435. END SUB
  436.  
  437. DEFSNG E
  438. SUB modification (i)
  439.  LOCATE 6 + 2 * (i - 1), 10: PRINT i
  440.  LOCATE 6 + 2 * (i - 1), 20: PRINT "            "
  441.  LOCATE 6 + 2 * (i - 1), 35: PRINT "              "
  442.  LOCATE 6 + 2 * (i - 1), 20: INPUT reac$(i)
  443.  LOCATE 6 + 2 * (i - 1), 35: INPUT tempcom%(i)
  444.  
  445. END SUB
  446.  
  447. DEFINT E
  448. SUB MOTCOMMU (com$)
  449.         PRINT #2, "01gF"
  450.         SLEEP 1
  451.         END SUB
  452.  
  453. SUB MOTINJ (inj$)
  454.  
  455.         PRINT #2, inj$
  456.         END SUB
  457.  
  458. DEFSNG E
  459. SUB SAUVEGARDE (fichier$)
  460. CLS
  461. LOCATE 10, 10
  462. PRINT "nom du fichier de sauvegarde"
  463. INPUT fichier$
  464. END SUB
  465.  
  466.  
Oct 19 '17 #1
0 970

Post your reply

Sign in to post your reply or Sign up for a free account.

Similar topics

3 posts views Thread by Stefan Berglund | last post: by
4 posts views Thread by danielduq | last post: by
reply views Thread by suyog_linux | last post: by
1 post views Thread by gcdp | last post: by
reply views Thread by gcreed | last post: by
By using this site, you agree to our Privacy Policy and Terms of Use.