jony7788
級別: 工控俠客
精華主題: 0
發(fā)帖數(shù)量: 50 個(gè)
工控威望: 2003 點(diǎn)
下載積分: 533 分
在線時(shí)間: 236(小時(shí))
注冊時(shí)間: 2023-02-25
最后登錄: 2025-03-03
查看jony7788的 主題 / 回貼
樓主  發(fā)表于: 72天前
圖片:
一圈360度,分為12個(gè)段點(diǎn),每個(gè)段點(diǎn)30度,每個(gè)段點(diǎn)都有一個(gè)開關(guān)。
當(dāng)開關(guān)打開的區(qū)間,步進(jìn)電機(jī)以正常速度旋轉(zhuǎn),并在段點(diǎn)停留0.5秒,沒有打開段點(diǎn)的區(qū)間,以快于正常速度進(jìn)行旋轉(zhuǎn),且不做停留。

以下例,1、2,5、6,9,10這幾個(gè)區(qū)間是正常速度,其它區(qū)間是快速通過。
償了下幾種方式,效果都不好,大多都是快速時(shí)跑過了頭,把正常區(qū)間都越過了。
PLC是三菱FX3U

希望老師們能指點(diǎn)下思路,感謝。

jony7788
級別: 工控俠客
精華主題: 0
發(fā)帖數(shù)量: 50 個(gè)
工控威望: 2003 點(diǎn)
下載積分: 533 分
在線時(shí)間: 236(小時(shí))
注冊時(shí)間: 2023-02-25
最后登錄: 2025-03-03
查看jony7788的 主題 / 回貼
1樓  發(fā)表于: 71天前
引用
引用第3樓木林森于2024-12-23 09:03發(fā)表的  :
軸旋轉(zhuǎn)前檢查開關(guān)狀態(tài),ON 則直接旋轉(zhuǎn) 30° 后停留 0.5S,OFF 則繼續(xù)檢查下一個(gè)節(jié)點(diǎn)開關(guān)狀態(tài)并進(jìn)行角度累加直到開關(guān)為 ON 后進(jìn)行旋轉(zhuǎn)停留


先用你的思路試一下,感謝。
jony7788
級別: 工控俠客
精華主題: 0
發(fā)帖數(shù)量: 50 個(gè)
工控威望: 2003 點(diǎn)
下載積分: 533 分
在線時(shí)間: 236(小時(shí))
注冊時(shí)間: 2023-02-25
最后登錄: 2025-03-03
查看jony7788的 主題 / 回貼
2樓  發(fā)表于: 71天前
引用
引用第2樓二手工控電器于2024-12-23 08:58發(fā)表的  :
重賞之下必有勇夫!!!這個(gè)看似邏輯簡單,實(shí)則梯形圖有些復(fù)雜!!!


有興趣和上班有空閑的朋友可以償試下,開關(guān)用中間繼電器代替,成功了的話個(gè)人發(fā)紅包200感謝,重賞談不上,只是一個(gè)為知識付費(fèi)的態(tài)度。
jony7788
級別: 工控俠客
精華主題: 0
發(fā)帖數(shù)量: 50 個(gè)
工控威望: 2003 點(diǎn)
下載積分: 533 分
在線時(shí)間: 236(小時(shí))
注冊時(shí)間: 2023-02-25
最后登錄: 2025-03-03
查看jony7788的 主題 / 回貼
3樓  發(fā)表于: 71天前
引用
引用第10樓dingzyi于2024-12-23 21:32發(fā)表的  :
步進(jìn)電機(jī)速度能快多少。步進(jìn)速度快了容易丟步。。停頓也要有時(shí)間的,為啥不用伺服。       

這個(gè)轉(zhuǎn)速不高,其實(shí)在快速通過的點(diǎn)位,按三樓說的,增加轉(zhuǎn)動(dòng)的脈沖數(shù),就可以了,最后一個(gè)點(diǎn)位是原點(diǎn),每個(gè)循環(huán)的最后動(dòng)作是回原點(diǎn)。
電機(jī)驅(qū)動(dòng)前有個(gè)點(diǎn)動(dòng)開關(guān),點(diǎn)動(dòng)一次,電機(jī)就一個(gè)循環(huán)動(dòng)作,沒什么丟步的問題。
jony7788
級別: 工控俠客
精華主題: 0
發(fā)帖數(shù)量: 50 個(gè)
工控威望: 2003 點(diǎn)
下載積分: 533 分
在線時(shí)間: 236(小時(shí))
注冊時(shí)間: 2023-02-25
最后登錄: 2025-03-03
查看jony7788的 主題 / 回貼
4樓  發(fā)表于: 70天前
引用
引用第14樓夢雨天涯于2024-12-24 15:07發(fā)表的  :
大概這個(gè)樣子,你覺得呢??


有點(diǎn)這個(gè)意思。
jony7788
級別: 工控俠客
精華主題: 0
發(fā)帖數(shù)量: 50 個(gè)
工控威望: 2003 點(diǎn)
下載積分: 533 分
在線時(shí)間: 236(小時(shí))
注冊時(shí)間: 2023-02-25
最后登錄: 2025-03-03
查看jony7788的 主題 / 回貼
5樓  發(fā)表于: 70天前
引用
引用第16樓紅云123于2024-12-24 17:05發(fā)表的  :
這個(gè)能不能實(shí)現(xiàn)


我目前的方法同你的方法有點(diǎn)類似,用電機(jī)的脈沖數(shù)來判斷區(qū)間,效果不是很好,如果前面全部是開,后面全部是斷,還可以,間隔開斷的反應(yīng)不過來。
jony7788
級別: 工控俠客
精華主題: 0
發(fā)帖數(shù)量: 50 個(gè)
工控威望: 2003 點(diǎn)
下載積分: 533 分
在線時(shí)間: 236(小時(shí))
注冊時(shí)間: 2023-02-25
最后登錄: 2025-03-03
查看jony7788的 主題 / 回貼
6樓  發(fā)表于: 10天前
請豆包幫忙寫的,調(diào)整幾次之后,可以正常運(yùn)行,用的是Arduino板子,豆包寫梯形圖的能力還不強(qiáng),寫這種編程語言厲害些。
// 定義步進(jìn)電機(jī)控制引腳
const int stepPin = 2;
const int dirPin = 3;

// 定義啟動(dòng)按鍵引腳
const int startButtonPin = 4;

// 定義 12 個(gè)開關(guān)引腳
const int switchPins[12] = {5, 6, 7, 8, 9, 10, 11, 12, 13, A0, A1, A2};

// 定義原點(diǎn)感應(yīng)點(diǎn)位引腳
const int originPin = A3;

// 定義料件感應(yīng)點(diǎn)位引腳
const int materialSensorPin = A4;

// 定義振動(dòng)盤點(diǎn)位引腳
const int vibrationDiskPin = A5;

// 定義步進(jìn)電機(jī)參數(shù)
const int stepsPerRevolution = 1000;  // 步進(jìn)電機(jī)每轉(zhuǎn)脈沖數(shù)

// 定義速度參數(shù)(毫秒)
const unsigned long normalSpeedDelay = 1;  // 正常速度延遲
const unsigned long fastSpeedDelay = 0.2;  // 快速速度延遲
const unsigned long returnSpeedDelay = 0.5; // 返回原點(diǎn)速度延遲

// 定義停留時(shí)間(毫秒)
const unsigned long pauseTime = 500;

// 定義變量
bool startButtonState = false;
bool lastStartButtonState = false;
bool isRunning = false;
bool isReturning = false;
int currentSegment = 0;
int remainingSteps = stepsPerRevolution;
unsigned long lastStepTime = 0;
unsigned long lastPauseTime = 0;
bool isPausing = false;

void setup() {
  // 初始化步進(jìn)電機(jī)控制引腳為輸出模式
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);

  // 初始化啟動(dòng)按鍵引腳為輸入模式,并啟用上拉電阻
  pinMode(startButtonPin, INPUT_PULLUP);

  // 初始化 12 個(gè)開關(guān)引腳為輸入模式,并啟用上拉電阻
  for (int i = 0; i < 12; i++) {
    pinMode(switchPins, INPUT_PULLUP);
  }

  // 初始化原點(diǎn)感應(yīng)點(diǎn)位引腳為輸入模式,并啟用上拉電阻
  pinMode(originPin, INPUT_PULLUP);

  // 初始化料件感應(yīng)點(diǎn)位引腳為輸入模式,并啟用上拉電阻
  pinMode(materialSensorPin, INPUT_PULLUP);

  // 初始化振動(dòng)盤點(diǎn)位引腳為輸出模式
  pinMode(vibrationDiskPin, OUTPUT);

  // 設(shè)置初始方向
  digitalWrite(dirPin, HIGH);
}

void loop() {
  // 讀取啟動(dòng)按鍵狀態(tài)
  startButtonState = digitalRead(startButtonPin);

  // 檢測啟動(dòng)按鍵按下事件
  if (startButtonState == LOW && lastStartButtonState == HIGH) {
    isRunning = true;
    currentSegment = 0;
    remainingSteps = stepsPerRevolution;
    isReturning = false;
  }

  // 保存上一次啟動(dòng)按鍵狀態(tài)
  lastStartButtonState = startButtonState;

  // 控制振動(dòng)盤
  bool materialDetected = digitalRead(materialSensorPin) == LOW;
  digitalWrite(vibrationDiskPin, !materialDetected);

  // 如果電機(jī)正在運(yùn)行
  if (isRunning) {
    if (isReturning) {
      unsigned long currentTime = millis();
      if (currentTime - lastStepTime >= returnSpeedDelay) {
        digitalWrite(dirPin, LOW); // 設(shè)置返回方向
        digitalWrite(stepPin, HIGH);
        delayMicroseconds(10);  // 確保脈沖寬度
        digitalWrite(stepPin, LOW);
        lastStepTime = currentTime;

        if (digitalRead(originPin) == LOW) {
          isRunning = false;
          isReturning = false;
          digitalWrite(dirPin, HIGH); // 恢復(fù)正向
        }
      }
    } else {
      if (isPausing) {
        if (millis() - lastPauseTime >= pauseTime) {
          isPausing = false;
        }
      } else {
        unsigned long currentTime = millis();
        bool switchState = digitalRead(switchPins[currentSegment]);
        unsigned long speedDelay = switchState ? normalSpeedDelay : fastSpeedDelay;

        if (currentTime - lastStepTime >= speedDelay) {
          if (remainingSteps > 0) {
            digitalWrite(stepPin, HIGH);
            delayMicroseconds(10);  // 確保脈沖寬度
            digitalWrite(stepPin, LOW);
            remainingSteps--;
            lastStepTime = currentTime;
          }
          if (remainingSteps * 12 <= (11 - currentSegment) * stepsPerRevolution) {
            if (switchState) {
              isPausing = true;
              lastPauseTime = currentTime;
            }
            currentSegment++;
          }
          if (currentSegment >= 12) {
            isReturning = true;
          }
        }
      }
    }
  }

  // 短暫延遲以減少 CPU 負(fù)載
  delay(1);
}